Note
-
排序
-
不要算样例数据的和!!!测试点不一样!!!
-
计算费用从00:00:00到dd:hh:mm计算可以避免跨天的问题.
e.g. 01:12:00到02:02:00——可以计算 bill(02:02:00-00:00:00) - bill(01:12:00-00:00:00)
-
巧用Map!!map<string, vector< node > > string可以作为索引,vector< node > 作为值。
//柳神Code摘取
struct node {
string name;
int status, month, time, day, hour, minute;
};
vector<node> data(n); //可以用vector代替结构体数组
map<string, vector<node>> custom;
for (int i = 1; i < n; i++) {
if (data[i].name == data[i - 1].name && data[i - 1].status == 1 && data[i].status == 0) {
custom[data[i - 1].name].push_back(data[i - 1]);
custom[data[i].name].push_back(data[i]);
}
}
//map的遍历
for (auto it : custom) {
vector<node> temp = it.second;
cout << it.first;
printf(" %02d\n", temp[0].month);
for (int i = 1; i < temp.size(); i += 2) {
//code
}
}
Code:
#include<bits/stdc++.h>
using namespace std;
struct customer{
string name;
int m,d,h,min,times;
bool status;
};
bool compare(customer a,customer b){
if(a.name!=b.name) return a.name<b.name;
else{
return a.times<b.times;
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
int money[24];
int n;
string st;
int m,d,h,mi;
for(int i=0;i<24;i++)
cin>>money[i];
cin>>n;
struct customer cus[1001];
for(int i=0;i<n;i++){
cin>>cus[i].name;
scanf("%02d:%02d:%02d:%02d",&cus[i].m,&cus[i].d,&cus[i].h,&cus[i].min);
cin>>st;
cus[i].times=cus[i].min+cus[i].h*60+cus[i].d*24*60;
if(st=="on-line") cus[i].status=true;
else cus[i].status=false;
}
sort(cus,cus+n,compare);
int mm[2],dd[2],hh[2],minn[2];
int i=0;
while(i<n){
int sign=0,fff=0;
double cost=0,tmp;
while(cus[i].name==cus[i+1].name){
fff=1;
i++;
if(cus[i-1].status==true&&cus[i].status==false){
if(sign==0){
sign=1;
cout<<cus[i-1].name;
printf(" %02d\n",cus[i-1].m);
}
printf("%02d:%02d:%02d ",cus[i-1].d,cus[i-1].h,cus[i-1].min);
printf("%02d:%02d:%02d ",cus[i].d,cus[i].h,cus[i].min);
int time=cus[i].times-cus[i-1].times;
printf("%d ",time);
tmp=0;
if(cus[i-1].d==cus[i].d){
if(cus[i-1].h==cus[i].h) tmp=time*money[cus[i-1].h];
else{
for(int j=cus[i-1].h;j<=cus[i].h;j++){
if(j==cus[i-1].h) tmp+=(60-cus[i-1].min)*money[cus[i-1].h];
else if(j==cus[i].h) tmp+=cus[i].min*money[cus[i].h];
else tmp+=60*money[j];
}
}
}
else{
for(int k=cus[i-1].d;k<=cus[i].d;k++){
if(k==cus[i-1].d){
for(int t=cus[i-1].h;t<24;t++){
if(t==cus[i-1].h) tmp+=(60-cus[i-1].min)*money[t];
else tmp+=60*money[t];
}
}
else if(k==cus[i].d){
for(int t=0;t<=cus[i].h;t++){
if(t==cus[i].h) tmp+=cus[i].min*money[t];
else tmp+=60*money[t];
}
}
else{
for(int t=0;t<24;t++) tmp+=60*money[t];
}
}
}
tmp=tmp*1.0/100;
cost+=tmp;
printf("$%.2lf\n",tmp);
}
}
if(sign==1){
printf("Total amount: $%.2lf\n",cost);
}
if(fff==0) i++;
}
return 0;
}