思路:
参考柳神博客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);
}
}