1016 Phone Bills - stl的使用

思路:

参考柳神博客https://blog.csdn.net/liuchuo/article/details/52294397

想了几个很复杂的方法都pass掉了,看了柳神博客,思路大概是,把所有的点都放到一个数组里,然后排序,按名字大小排,相同的按时间先后排,这样的话,我们判断的时候就比较数组的后一个元素和前一个元素,若名字同且后一个off-line前一个on-line那么就是成功匹配上了,之后就用map<string,vector<node> >cus来存对应名字后的时间点,算时间差和费用的时候,我们都用相减的方法,这样比较不容易出错!

(主要还是stl用的不熟练,map自动给关键字从小到大排序,first指的关键字,second指的对应的node值)

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int N=10005;
struct node{
    string name;
    int f,mon,d,h,m,time;
};

bool cmp(node a,node b){
    if(a.name!=b.name)return a.name<=b.name;
    else return a.time<b.time;
}
int rate[25]={0};
double tra(node a){
    double tot=rate[a.h]*a.m+rate[24]*60*a.d;
    for(int i=0;i<a.h;i++){
        tot+=rate[i]*60;
    }
    return tot/=100.0;
}


int main(){
    int n;
    for(int i=0;i<24;i++){
        scanf("%d",&rate[i]);
        rate[24]+=rate[i];
    }
    scanf("%d",&n);
    string tmp;
    vector<node>date(n);
    for(int i=0;i<n;i++){
        cin>>date[i].name;
        scanf("%d:%d:%d:%d",&date[i].mon,&date[i].d,&date[i].h,&date[i].m);
        cin>>tmp;
        date[i].f=(tmp=="on-line"?1:0);
        date[i].time=date[i].d*24*60+date[i].h*60+date[i].m;
    }
    sort(date.begin(),date.end(),cmp);
    map<string,vector<node> >cus;
    for(int i=1;i<n;i++){
        if(date[i].name==date[i-1].name&&date[i].f==0&&date[i-1].f==1){
            cus[date[i-1].name].push_back(date[i-1]);
            cus[date[i].name].push_back(date[i]);
        }
    }

    for(auto it=cus.begin();it!=cus.end();it++){
        vector<node> tt=it->second;
        cout<<it->first<<" ";
        printf("%02d\n",tt[0].mon);
        double tot=0.0;
        for(int i=1;i<tt.size();i+=2){
            double t=tra(tt[i])-tra(tt[i-1]);
            printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",tt[i-1].d,tt[i-1].h,tt[i-1].m,tt[i].d,tt[i].h,tt[i].m,tt[i].time-tt[i-1].time,t);
            tot+=t;
        }
        printf("Total amount: $%.2f\n",tot);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值