1016 (STL)


/*
原来他只会显示一个月的账单,不存在有两个月的
用node存输入数据,建立一个vector存node,排好序,建立map把对应数据存到名字下(开始跟着挂断时间)
用auto建立迭代器,循环map
*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
struct node{
    string name;
    int status,time,month,day,hour,minute;
};

bool cmp(node a,node b){
    return a.name != b.name ? a.name < b.name :a.time < b.time;
}
double charge(node call, int *rate) {   //操作的是传入的这一个node
    double total = rate[call.hour] * call.minute + rate[24] * 60 * call.day;
    for (int i = 0; i < call.hour; i++)
        total += rate[i] * 60;
    return total / 100.0;    //把所有花费算出来再减
}

int main(){
    int rate[25]={0},n;
    for(int i=0;i<24;i++){
        scanf("%d",&rate[i]);
        rate[24] += rate[i];
    }
    scanf("%d",&n);
    vector<node> data(n);
    for(int i=0;i<n;i++){
        cin>>data[i].name;
        scanf("%d:%d:%d:%d",&data[i].month,&data[i].day,&data[i].hour,&data[i].minute);
        string temp;
        cin>>temp;
        data[i].status=(temp=="on-line")?1:0;
        data[i].time=data[i].day*24*60+data[i].hour*60+data[i].minute;
    }
    sort(data.begin(),data.end(),cmp);
    map<string,vector<node> > custom;
    for(int i=1;i<n;i++){                    //打完一个电话之前是不会再打另一个电话的,所以数据是有规律的
        if(data[i].name==data[i-1].name&&data[i].status==0&&data[i-1].status==1){
            custom[data[i-1].name].push_back(data[i-1]);       //把data存到data.name里,先存i-1;
            custom[data[i].name].push_back(data[i]);           //相同的的信息存在一个name里
        }
    }
    //for(auto it=std::begin(custom);it!=std::end(custom);it++){
    for(auto it:custom){            //这个是值传递,上句是it是迭代器
        vector<node> temp=it.second;   //这个map的first是string,second是vector,应该很好理解
        cout<<it.first;
        printf(" %02d\n",temp[0].month);
        double total=0.0;
        for(int i=1;i<temp.size();i+=2){
            double t=charge(temp[i],rate)-charge(temp[i-1],rate);
            printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n", temp[i - 1].day, temp[i - 1].hour, temp[i - 1].minute, temp[i].day, temp[i].hour, temp[i].minute, temp[i].time - temp[i - 1].time, t);
            total += t;
        }
        printf("Total amount: $%.2f\n", total);
    }
    return 0;
}

auto关键字:

http://blog.csdn.net/yhl_leo/article/details/50864612

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值