PAT (Advanced Level) 1016 Phone Bills(恶心模拟)
生活随笔
收集整理的這篇文章主要介紹了
PAT (Advanced Level) 1016 Phone Bills(恶心模拟)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:模擬電話收費規則:
最后輸出每個用戶的電話費
題目分析:甲級的題目我就沒讀明白過,加上漏掉了好多細節,導致前期白費功夫:
再加上通過分析可以得到的,首先若可以組成配對,則排序后相鄰兩個的信息中,必須前者是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(恶心模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT (Advanced Level)
- 下一篇: 中石油训练赛 - 01 Matrix(构