題目連接: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;
}