日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PAT (Advanced Level) 1016 Phone Bills(恶心模拟)

發布時間:2024/4/11 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT (Advanced Level) 1016 Phone Bills(恶心模拟) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:模擬電話收費規則:

  • 每個時間段的收費不同,時間段分為:00:00-01:00,01:00-02:00諸如此類
  • 最開始給出的單價是每分鐘的單價
  • 最后輸出每個用戶的電話費

    題目分析:甲級的題目我就沒讀明白過,加上漏掉了好多細節,導致前期白費功夫:

  • 題目保證給出相同的月份
  • 電話費為0的人不需要輸出
  • 初始時給出的單價是美分,題目要求輸出的答案是美元,100美分=1美元
  • 再加上通過分析可以得到的,首先若可以組成配對,則排序后相鄰兩個的信息中,必須前者是on-line,后者是off-line,關于給出兩個時間該怎么求花費,一開始我想推公式,O(1)得到答案,可是發現細枝末節太多了,根本顧不過來,最后還是屈服了,用了時間代價,枚舉分鐘來實現的,不得不說,暴力牛逼

    一個是一開始沒讀懂題就直接上手做,導致做了很多無用功,還有一個就是能暴力就暴力,別想著亂七八糟的公式和規律了,暴力好理解還好實現,難道他不香嗎?

    掛代碼吧,被惡心到了:

    #include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;int cost[25];int sum_cost=0;//所有的花費之和unordered_map<string,bool>vis;//用來記錄當前的人是否被訪問過struct date//記錄時間 {int month;int day,hour,minute;bool operator<(const date& a)const{if(day!=a.day)return day<a.day;if(hour!=a.hour)return hour<a.hour;return minute<a.minute;} };struct Node//記錄每次通話信息 {string name;date time;bool state;bool operator<(const Node& a)const{if(name!=a.name)//先按姓名升序return name<a.name;return time<a.time;//再按時間升序} }a[N];int get_sub(date st,date ed)//得到兩次時間之差,返回分鐘 {int ans1=st.day*24*60+st.hour*60+st.minute;int ans2=ed.day*24*60+ed.hour*60+ed.minute;return abs(ans1-ans2); }int cal(date st,date ed)//計算兩次時間之間的花費,st<=ed {int d=st.day,h=st.hour,m=st.minute;int dd=ed.day,hh=ed.hour,mm=ed.minute;int ans=0;while(d<dd||h<hh||m<mm){m++;ans+=cost[h];if(m==60){m=0;h++;}if(h==24){h=0;d++;}}return ans; }int main() { // freopen("input.txt","r",stdin);for(int i=0;i<24;i++){scanf("%d",cost+i);sum_cost+=cost[i];}int n;scanf("%d",&n);for(int i=1;i<=n;i++){cin>>a[i].name;scanf("%d:%d:%d:%d",&a[i].time.month,&a[i].time.day,&a[i].time.hour,&a[i].time.minute);char ss[10];scanf("%s",ss);if(ss[1]=='n')a[i].state=true;elsea[i].state=false;}sort(a+1,a+1+n);int sum=0;for(int i=2;i<=n;i++){if(a[i].name==a[i-1].name&&!a[i].state&&a[i-1].state)//同一個人,并且前一個是on,后一個是off{if(!vis[a[i-1].name])//如果沒輸出過,輸出姓名{printf("%s %02d\n",a[i-1].name.c_str(),a[i-1].time.month);//第一次打印姓名vis[a[i-1].name]=true; }int money=cal(a[i-1].time,a[i].time);sum+=money;date st=a[i-1].time;date ed=a[i].time;printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",st.day,st.hour,st.minute,ed.day,ed.hour,ed.minute,get_sub(st,ed),1.0*money/100);}if((i==n||a[i].name!=a[i+1].name)&&sum!=0)//sum為0時不必輸出{printf("Total amount: $%.2f\n",1.0*sum/100);sum=0;}}return 0; }

    ?

    總結

    以上是生活随笔為你收集整理的PAT (Advanced Level) 1016 Phone Bills(恶心模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。