PAT (Advanced Level) Practice 1016 Phone Bills (25 point(s))

题目:PAT A 1016

题目大意

首先输入24整数,表示在一天中24个小时的某个时辰打电话的费率。(美分/每分钟)。
接下来有n条记录。每条记录的格式如下:用户名MM:dd:HH:mm(分别表示月:天:时:分)。以及一个类型表示接通on-line和挂断off-line

题目需要按照用户名的字典序输出每个用户的账单。输出的格式为

用户名 月份
接通时间1 挂断时间1 通话时长1 费用1
接通时间2 挂断时间2 通话时长2 费用2
总计费用

首先本人感觉最难理解的部分是费用的计算。参考了别人的费用计算,但是,我没明白怎么回事

#include<bits/stdc++.h>
using namespace std;
int toll[25];
struct Node{
    string name;
    bool type;
    int month,day,hour,minute,time;

};
vector<Node>recoder;
bool cmp(const Node &a,const Node &b){
    if(a.name==b.name) return a.time<b.time;
    return a.name<b.name;
}
double getBill(Node &a){
    double total=toll[a.hour]*a.minute+toll[24]*60*a.day;
    for(int i=0;i<a.hour;++i) total+=toll[i]*60;
    return total/100.0;
}
int main(){
    for(int i=0;i<24;++i){
        scanf("%d",&toll[i]);
        toll[24]+=toll[i];
    }
    int n;
    scanf("%d",&n);
    recoder.resize(n);
    string temp;
    for(int i=0;i<n;++i){
        cin>>recoder[i].name;
        scanf("%d:%d:%d:%d",&recoder[i].month,&recoder[i].day,&recoder[i].hour,&recoder[i].minute);
        recoder[i].time=recoder[i].day*24*60+recoder[i].hour*60+recoder[i].minute;
        cin>>temp;
        if(temp=="on-line") recoder[i].type=1;
        else recoder[i].type=0;
    }
    sort(recoder.begin(),recoder.end(),cmp);
    map<string,vector<Node> > custom ;//用map记录每个用户的账单
    for(int i=1;i<n;++i){
       
        if(recoder[i].name==recoder[i-1].name&&recoder[i].type==0&&recoder[i-1].type==1){
            custom[recoder[i].name].push_back(recoder[i-1]);
            custom[recoder[i].name].push_back(recoder[i]);
        }
    }
    map<string,vector<Node>>::iterator it;
    for(it=custom.begin();it!=custom.end();it++){
        vector<Node>tmp=it->second;
        cout<<it->first;
        printf(" %02d\n",tmp[0].month);
        double total=0;
        for(int i=1;i<tmp.size();i+=2){
            double t=getBill(tmp[i])-getBill(tmp[i-1]);
            printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",tmp[i-1].day,tmp[i-1].hour,tmp[i-1].minute,tmp[i].day,tmp[i].hour,tmp[i].minute,tmp[i].time-tmp[i-1].time,t);
            total+=t;
        }
        printf("Total amount: $%.2f\n",total);
    }
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值