题目:Phone Bills
我的代码:
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
typedef struct{
string name;
map<string,string>time;
}consumer;
//根据名字排序
bool cmp(consumer c1,consumer c2){
return c1.name < c2.name;
}
//计算时间和话费
int trans(string sta,string end,int cent[],int &time,float &amount){
int day,hour,min;
min = stoi(sta.substr(9,2));
hour = stoi(sta.substr(6,2));
day = stoi(sta.substr(3,2));
while(day<stoi(end.substr(3,2)) || hour<stoi(end.substr(6,2)) || min<stoi(end.substr(9,2))){
min++;
time++;
amount += cent[hour];
if(min == 60){
min = 0;
hour++;
}
if(hour == 24){
hour = 0;
day++;
}
}
}
int main(){
consumer cos[1000];
int cent[25],N,sum = 0,min = 0;//sum是指真正有多少个人,min是指通话时长
float cost;
float amount = 0; //总共话费
map<string,int>mp;
for(int i = 0;i < 24;i++){
cin>>cent[i];
}
cin>>N;
for(int i = 0;i < N;i++){
string s1,s2,s3;
cin>>s1>>s2>>s3;
auto it = mp.find(s1);
if(it == mp.end()){ //还没有添加的用户
cos[sum].name = s1;
cos[sum].time[s2] = s3;
mp[s1] = sum;
sum++;
}
else{
cos[it -> second].time[s2] = s3;
}
}
//cout<<sum<<endl;
sort(cos,cos+sum,cmp);
int flag = 0;
int on1 = 1;
int on2 = 1;
for(int i = 0;i < sum;i++){ //三重循环,感觉会爆
auto it1 = cos[i].time.begin();
auto it2 = cos[i].time.begin();
for( ;it1 != cos[i].time.end();it1++){
min = amount = 0;
auto it2 = it1;
it2--;
if(it1 -> second == "off-line" && it2 -> second == "on-line"){
flag=1;
if(on1 == 1){
cout<<cos[i].name<<' '<<it1 -> first.substr(0,2)<<endl;
on1++;
}
trans(it2 ->first,it1 ->first,cent,min,amount);
//cout<<amount<<endl;
cout<<it2 ->first.substr(3,11)<<' ';
cout<<it1 ->first.substr(3,11)<<' ';
cout<<min<<' '<<"$";
printf("%.2f\n",amount/100);
cost += amount;
}
}
if(flag == 1 && on2 == 1){
printf("Total amount: $%.2f\n",cost/100);
on2++;
}
cost = flag = 0;
on1 = on2 = 1;
}
return 0;
}
评注:计算费用那里的思路比较经典