版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lianwaiyuwusheng/article/details/87800959
问题描述:给定每天每个时段的通话费用和每个人的打挂电话的记录,输出每个人的总费用和通话记录。
解题思路:用map将每个人与自己的通话记录关联起来,再对记录排序,计算费用,输出。计算费用,采用累积的方法,T1--T2的费用相当于从0->T2的费用减去0->T1的费用。
AC代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<string>
using namespace std;
typedef struct rec{
int M,D,H,m;
bool tag;
rec(int a,int b,int c,int d,bool t):M(a),D(b),H(c),m(d),tag(t){}
}rec;
map<string,vector<rec> >R;
int toll[25],rate[25];
double all;
bool cmp(rec &a,rec &b)
{
return a.D*24*60+a.H*60+a.m<b.D*24*60+b.H*60+b.m;
}
void tolls(rec &a,rec &b)//计算一次通话费用
{
printf("%02d:%02d:%02d %02d:%02d:%02d ",a.D,a.H,a.m,b.D,b.H,b.m);
printf("%d ",(b.D-a.D)*24*60+(b.H-a.H)*60+b.m-a.m);
//重点,如何计算费用!!!!从一天0点开始,累积计算
double x=(b.D-a.D)*rate[24]*60+(rate[b.H]-rate[a.H])*60+toll[b.H]*b.m-toll[a.H]*a.m;
printf("$%.2lf\n",x/100.00); //为什么%.2llf会出错?????????
all+=x;
}
int main()
{
freopen("test.txt","r",stdin);
for(int i=0;i<24;++i){
scanf("%d",&toll[i]);
rate[i+1]+=rate[i]+toll[i];//rate为累积费用,toll为小时费用
}
int N;
scanf("%d",&N);
while(N--){
string id,tag;
bool t;
int m,d,h,s;
cin>>id;
scanf("%d:%d:%d:%d",&m,&d,&h,&s);
cin>>tag;
tag=="on-line"?t=1:t=0;
R[id].push_back(rec(m,d,h,s,t));//将记录根据人的不同分别储存
}
map<string,vector<rec> >::iterator it=R.begin();
while(it!=R.end()){
all=0;
bool flag=0;
sort(it->second.begin(),it->second.end(),cmp);//按照时间排序
int n=it->second.size();
for(int i=0;i<n;++i){//遍历该人的所有通话记录
if(it->second[i].tag){//在线
int j=i+1;
while(j<n&&it->second[j].tag){++i;++j;}//离线
if(j<n){//匹配,注意!!!!可能一个人的通话记录一次都没匹配过
if(!flag)printf("%s %02d\n",it->first.c_str(),it->second[i].M);//访问map的value数组
tolls(it->second[i],it->second[j]);
++i;flag=1;
}
}
}
if(flag)printf("Total amount: $%.2lf\n",all/100.00);
++it;
}
return 0;
}