1. 程式人生 > >1016 Phone Bills

1016 Phone Bills

思路:

想了幾個很複雜的方法都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);
    }
}