1016 Phone Bills (25 分)

题意

  • 不能直接输出姓名,因为如果你的账单不符合,你的名字是不会被打印出来的。
  • 排序题

code

#include <bits/stdc++.h>
using namespace std;
struct node{
    string name;
    int month,day,hh,mm,status;
    int last;
};
int p[25];
bool cmp(node a,node b){
    return a.name!=b.name?a.name<b.name:a.last<b.last;
}
double bill(node a){
    double sum=0;
    sum=p[24]*a.day*60+p[a.hh]*a.mm;
    for(int i=0;i<a.hh;i++) sum+=60*p[i];
    return sum/100;
}
int main(){
    for(int i=0;i<24;i++){
        cin>>p[i];
        p[24]+=p[i];
    }
    int n;
    cin>>n;
    node res[n];
    for(int i=0;i<n;i++){
        cin>>res[i].name;
        scanf("%d:%d:%d:%d",&res[i].month,&res[i].day,&res[i].hh,&res[i].mm);
        string s;
        cin>>s;
        s=="on-line"?res[i].status=1:res[i].status=0;
        res[i].last=res[i].day*24*60+res[i].hh*60+res[i].mm;
    }
    sort(res,res+n,cmp);
    string name;
    map<string,vector<node>> m;
    for(int i=1;i<n;i++)
        if(res[i].name==res[i-1].name&&res[i].status==0&&res[i-1].status==1){
            m[res[i].name].push_back(res[i-1]);
            m[res[i].name].push_back(res[i]);
        }
    for(auto it:m){
        printf("%s %02d\n",it.first.c_str(),it.second[0].month);
        double sum=0,t=0;
        for (int i=1;i<it.second.size();i+=2){
            t=bill(it.second[i])-bill(it.second[i-1]);
            sum+=t;
            printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",it.second[i-1].day,it.second[i-1].hh,it.second[i-1].mm,it.second[i].day,it.second[i].hh,it.second[i].mm,it.second[i].last-it.second[i-1].last,t);
        }
        printf("Total amount: $%.2f\n",sum);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值