【PAT】1016 Phone Bills (25 分)

题目链接

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
double timm[24];

struct per{
    string name;
    int d,h,m,M;
    string state;
}p[1010];

bool comp(per &a,per &b){
    if(a.name==b.name){
        if(a.d==b.d){
            if(a.h==b.h){
                return a.m<b.m;
            }else{
                return a.h<b.h;
            }
        }else{
            return a.d<b.d;
        }
    }else{
        return a.name<b.name;
    }

}

int main()
{
    double h_money=0;//每天/元
    for(int i=0;i<24;i++){
        cin>>timm[i];//这是每分钟的钱,单位为分
        timm[i]*=0.01;
        h_money+=timm[i];
    }
    h_money*=60;
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
       cin>>p[i].name;
       string t;
       cin>>t;
       p[i].M=(t[0]-'0')*10+(t[1]-'0');
       p[i].d=(t[3]-'0')*10+(t[4]-'0');
       p[i].h=(t[6]-'0')*10+(t[7]-'0');
       p[i].m=(t[9]-'0')*10+(t[10]-'0');
       cin>>p[i].state;
    }
    sort(p,p+n,comp);
    /*for(int i=0;i<n;i++){
        cout<<p[i].name;
        printf(" %02d:%02d:%02d:%02d",p[i].M,p[i].d,p[i].h,p[i].m);
        cout<<p[i].state<<endl;
    }*/
    //这是第一种方法,用一个flag来判断某位person是否有匹配
    int flag=0;//0表示没有输出过
    per start;
    start.name=p[0].name;
    start.M=p[0].M;
    start.d=p[0].d;
    start.h=p[0].h;
    start.m=p[0].m;
    start.state=p[0].state;
    double total=0;
    for(int i=1;i<n;i++){
        if(p[i].name!=start.name){
            if(flag){
                //结算前一个人的
                printf("Total amount: $%.2f\n",total);
                total=0.0;
                flag=0;
            }
        }else{
            if(start.state=="on-line"&&p[i].state=="off-line"){
                //计算时间
                int t_day=(p[i].d-start.d)*24*60;
                int t_h=(p[i].h-start.h)*60;
                int t_m=(p[i].m-start.m);
                //计算bill
                //计算天数
                double money=0.0;
                money+=(p[i].d-start.d)*h_money;
                //计算小时
                if(p[i].h>start.h){
                    //不能这么干,应为不同的i,timm不同
                    //money+=(p[i].m-start.m)*timm[i]*60;
                    //只能用循环
                    for(int j=start.h;j<p[i].h;j++){
                        money+=timm[j]*60;
                    }
                }else{
                    for(int j=p[i].h;j<start.h;j++){
                        money-=timm[j]*60;
                    }
                }
                //分钟
                money-=start.m*timm[start.h];
                money+=p[i].m*timm[p[i].h];
                //没有被匹配过
                if(flag==0){
                    cout<<p[i].name;
                    printf(" %02d\n",p[i].M);
                    flag=1;
                }
                printf("%02d:%02d:%02d %02d:%02d:%02d ",start.d,start.h,start.m,p[i].d,p[i].h,p[i].m);
                printf("%d $%.2f\n",t_day+t_h+t_m,money);
                total+=money;
            }
        }
        start.name=p[i].name;
        start.M=p[i].M;
        start.d=p[i].d;
        start.h=p[i].h;
        start.m=p[i].m;
        start.state=p[i].state;
    }
    if(flag){
    	//这里如果是lf,结果会是0
        printf("Total amount: $%.2f\n",total);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值