1016. Phone Bills (25)

題目連接:https://www.patest.cn/contests/pat-a-practise/1016


題目大意:給出一系列的電話記錄,這些記錄每個通話接通的時刻和掛斷的時刻。從中找出完整的通話記錄(同時含接通時刻和掛斷時刻),然後輸出,輸出按照姓名排序,同一個人的按照時間先後排序


解題思路:思路不難,但比較繁瑣。將所有記錄按照姓名排序,姓名相同的按照時間排序。然後從記錄中挑出符合條件的記錄對。


代碼如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
struct record
{
    string name;//記錄的姓名
    int month,day,hour,minute;//記錄的時間
    bool flag;//接通還是掛斷
};
double compute(record r,int *rate){//用來計算錢,以00:00:00爲基準.計算花費的時候使用差值
    double total=rate[r.hour]*r.minute+rate[24]*60*r.day;
    for (int i=0;i<r.hour;i++)
        total+=rate[i]*60;
    return total/100.0;
}
bool cmp1(record a,record b){//先按名字排序,名字相同的按照時間排序
    if(a.name==b.name){
        if(a.day==b.day){
            if(a.hour==b.hour)
                return a.minute<b.minute;
            else
                return a.hour<b.hour;
        }
        else
            return a.day<b.day;
    }
    else
        return a.name<b.name;

}
int main(int argc, char const *argv[])
{
    int toll[25]={0};
    for(int i=0;i<24;i++){
        cin>>toll[i];
        toll[24]+=toll[i];
    }
    int N;
    cin>>N;
    record buf[N];
    string offon;
    for(int i=0;i<N;i++){//開始輸入記錄
        cin>>buf[i].name;
        scanf("%02d:%02d:%02d:%02d",&buf[i].month,&buf[i].day,&buf[i].hour,&buf[i].minute);
        cin>>offon;
        if(offon=="on-line")
            buf[i].flag=true;
        else
            buf[i].flag=false;
    }
    sort(buf,buf+N,cmp1);
    map<string,vector<record>> m_map;//鍵爲名字,值爲該名字的所有記錄
    for(int i=1;i<N;i++){//將能夠配對成功的記錄保存在map中
        if(buf[i].name==buf[i-1].name&&buf[i].flag==false&&buf[i-1].flag==true){//配對成功
            m_map[buf[i-1].name].push_back(buf[i-1]);
            m_map[buf[i].name].push_back(buf[i]);
        }
    }
    map<string,vector<record>>::iterator it;
    for(it=m_map.begin();it!=m_map.end();it++){
        cout<<it->first;//輸出名字
        vector<record> R=it->second;//改名字的所有配對記錄
        printf(" %02d\n",R[0].month);//輸出月份
        double total=0;//該人的所有記錄的總花費
        for(int i=0;i<R.size()-1;i+=2){//遍歷每個記錄對
            double price=compute(R[i+1],toll)-compute(R[i],toll);
            int t=(R[i+1].day*24+R[i+1].hour)*60+R[i+1].minute-(R[i].day*24+R[i].hour)*60-R[i].minute;
            printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",R[i].day,R[i].hour,R[i].minute,R[i+1].day,R[i+1].hour,R[i+1].minute,t,price);
            total+=price;
        }
        printf("Total amount: $%.2f\n", total);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章