题意分析:
(1)给出一天24个小时各时间段之内长途电话的价格(cents/minutes),再给出若干条通话记录,通话记录由:name 时间 上线/下线,根据通话记录按照要求列出每个人在某个月的通话时间段,时长,通话费用,以及本月通话费用
(2)将每个通话记录包装成一个结构体,然后对结构体数组(Vector)进行按姓名的字典序、时间排序
(3)过滤掉没有匹配项的通话记录,转存到Vector中,最后再遍历Vector依次输出每个人的电话账单,当然也可以直接操作数组,这样操作起来比较麻烦
可能坑点:
(1)本题是PAT(A)题当中难度不大,但是比较繁杂的题目,特别是话费计算的问题以及过滤之后价格输出的格式问题(很多人坑在这上面,总价格的输出一定是在遍历到当前电话记录的姓名和上一个电话记录的姓名不一致时或者是已经遍历完最后一个人)。首先,通话时间段要分为跨越一天、跨越一个小时、在一个小时以内这三种情况讨论。
#include <iostream>
#include <string.h>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <stdio.h>
using namespace std;
struct record
{
string name;
int dateTime[4];
string status;
};
record rec[1001];
int rate[25];
bool cmp(record a,record b)
{
if(a.name!=b.name)return a.name<b.name;
else if(a.dateTime[0]!=b.dateTime[0])return a.dateTime[0]<b.dateTime[0];
else if(a.dateTime[1]!=b.dateTime[1])return a.dateTime[1]<b.dateTime[1];
else if(a.dateTime[2]!=b.dateTime[2])return a.dateTime[2]<b.dateTime[2];
else return a.dateTime[3]<b.dateTime[3];
}
int get_min(int dateTime1[4],int dateTime2[4])
{
return (dateTime2[1]-dateTime1[1])*24*60+(dateTime2[2]-dateTime1[2])*60+dateTime2[3]-dateTime1[3];
}
double payment(int dateTime1[4],int dateTime2[4])
{
double total=0;
total+=(dateTime2[1]-dateTime1[1])*60*rate[24];
if(dateTime2[2]>dateTime1[2]||(dateTime2[2]==dateTime1[2])&&dateTime2[3]>=dateTime1[3])
{
double temp=0;
//通话时间跨越一天
for(int i=dateTime1[2]+1;i<dateTime2[2];i++)
{
temp+=rate[i]*60;
}
total+=temp;
//通话时间跨越一个小时
if(dateTime2[2]>dateTime1[2])total+=((60-dateTime1[3])*rate[dateTime1[2]]+dateTime2[3]*rate[dateTime2[2]]);
//通话时间在同一小时之内
else total+=(dateTime2[3]-dateTime1[3])*rate[dateTime1[2]];
}
else
{
double temp=0;
for(int i=dateTime2[2]+1;i<dateTime1[2];i++)
{
temp+=rate[i]*60;
}
total-=temp;
if(dateTime1[2]>dateTime2[2])total-=((60-dateTime2[3])*rate[dateTime2[2]]+dateTime1[3]*rate[dateTime1[2]]);
else total-=(dateTime1[3]-dateTime2[3])*rate[dateTime1[2]];
}
return total/100;
}
int main()
{
int i=0;
while(i<24)
{
scanf("%d",&rate[i]);
rate[24]+=rate[i];
i++;
}
int N,j=0;
cin>>N;
while(j<N)
{
cin>>rec[j].name;
scanf("%d:%d:%d:%d",&rec[j].dateTime[0],&rec[j].dateTime[1],&rec[j].dateTime[2],&rec[j].dateTime[3]);
cin>>rec[j].status;
j++;
}
sort(&rec[0],&rec[N],cmp);
vector<record > vec;
int first=1;
double pay=0;
double total=0;
int minutes=0;
for(int k=0;k<N;k++)
{
int l=k+1;
if(rec[k].name!=rec[l].name||rec[k].status!="on-line"||rec[l].status!="off-line")continue;
if(vec.size()>0&&rec[k].name!=vec.back().name)
{
first=1;
printf("Total amount: $%.2lf\n",total);
total=0;
}
vec.push_back(rec[k]);
vec.push_back(rec[l]);
if(first)
{
cout<<rec[k].name<<" "<<setw(2)<<setfill('0')<<rec[k].dateTime[0]<<endl;
first=0;
}
pay=payment(rec[k].dateTime,rec[l].dateTime);
minutes=get_min(rec[k].dateTime,rec[l].dateTime);
total+=pay;
printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2lf\n",
rec[k].dateTime[1],rec[k].dateTime[2],rec[k].dateTime[3],
rec[l].dateTime[1],rec[l].dateTime[2],rec[l].dateTime[3],
minutes,pay);
}
if(vec.size()>0)printf("Total amount: $%.2lf\n",total);
return 0;
}