1016 Phone Bills - stl的使用
阿新 • • 發佈:2018-12-06
思路:
參考柳神部落格https://blog.csdn.net/liuchuo/article/details/52294397
想了幾個很複雜的方法都pass掉了,看了柳神部落格,思路大概是,把所有的點都放到一個數組裡,然後排序,按名字大小排,相同的按時間先後排,這樣的話,我們判斷的時候就比較陣列的後一個元素和前一個元素,若名字同且後一個off-line前一個on-line那麼就是成功匹配上了,之後就用map<string,vector<node> >cus來存對應名字後的時間點,算時間差和費用的時候,我們都用相減的方法,這樣比較不容易出錯!
(主要還是stl用的不熟練,map自動給關鍵字從小到大排序,first指的關鍵字,second指的對應的node值)
程式碼如下:
#include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<queue> #include<cmath> #include<set> #include<map> #define ll long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; const int N=10005; struct node{ string name; int f,mon,d,h,m,time; }; bool cmp(node a,node b){ if(a.name!=b.name)return a.name<=b.name; else return a.time<b.time; } int rate[25]={0}; double tra(node a){ double tot=rate[a.h]*a.m+rate[24]*60*a.d; for(int i=0;i<a.h;i++){ tot+=rate[i]*60; } return tot/=100.0; } int main(){ int n; for(int i=0;i<24;i++){ scanf("%d",&rate[i]); rate[24]+=rate[i]; } scanf("%d",&n); string tmp; vector<node>date(n); for(int i=0;i<n;i++){ cin>>date[i].name; scanf("%d:%d:%d:%d",&date[i].mon,&date[i].d,&date[i].h,&date[i].m); cin>>tmp; date[i].f=(tmp=="on-line"?1:0); date[i].time=date[i].d*24*60+date[i].h*60+date[i].m; } sort(date.begin(),date.end(),cmp); map<string,vector<node> >cus; for(int i=1;i<n;i++){ if(date[i].name==date[i-1].name&&date[i].f==0&&date[i-1].f==1){ cus[date[i-1].name].push_back(date[i-1]); cus[date[i].name].push_back(date[i]); } } for(auto it=cus.begin();it!=cus.end();it++){ vector<node> tt=it->second; cout<<it->first<<" "; printf("%02d\n",tt[0].mon); double tot=0.0; for(int i=1;i<tt.size();i+=2){ double t=tra(tt[i])-tra(tt[i-1]); printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",tt[i-1].d,tt[i-1].h,tt[i-1].m,tt[i].d,tt[i].h,tt[i].m,tt[i].time-tt[i-1].time,t); tot+=t; } printf("Total amount: $%.2f\n",tot); } }