题目

计算每个人的电话费用
解法1
点击查看代码
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
struct Person{
string name, date, status;
};
vector<int> rate(24);
bool cmp(const Person& p1, const Person& p2){
if(p1.name != p2.name) return p1.name < p2.name;
else return p1.date < p2.date;
}
int getMinute(const string& start, const string& end) {
int day1 = stoi(start.substr(0, 2));
int hour1 = stoi(start.substr(3, 2));
int minute1 = stoi(start.substr(6, 2));
int day2 = stoi(end.substr(0, 2));
int hour2 = stoi(end.substr(3, 2));
int minute2 = stoi(end.substr(6, 2));
return (day2 - day1) * 24 * 60 + (hour2 - hour1) * 60 + (minute2 - minute1);
}
int getCost(string start,string end){
int day1 = stoi(start.substr(0, 2));
int hour1 = stoi(start.substr(3, 2));
int minute1 = stoi(start.substr(6, 2));
int day2 = stoi(end.substr(0, 2));
int hour2 = stoi(end.substr(3, 2));
int minute2 = stoi(end.substr(6, 2));
int cost = 0;
// 模拟时间流逝,逐分钟累加费用
while (day1 < day2 || hour1 < hour2 || minute1 < minute2) {
cost += rate[hour1];
minute1++;
if (minute1 == 60) {
minute1 = 0;
hour1++;
if (hour1 == 24) {
hour1 = 0;
day1++;
}
}
}
return cost;
}
int main(){
for(int i =0;i<24;i++) scanf("%d",&rate[i]);
int n; scanf("%d",&n);
vector<Person> records(n);
for(int i=0;i<n;i++) cin>>records[i].name>>records[i].date>>records[i].status;
// 对记录排序(姓名优先,时间其次)
sort(records.begin(),records.end(),cmp);
// 过滤有效的记录,截取每个人的起始记录
map<string,vector<pair<Person,Person>> > p2p;
for(int i =1;i<n;i++){
if(records[i].name == records[i-1].name &&
records[i-1].status == "on-line" &&
records[i].status == "off-line"){
p2p[records[i].name].push_back({records[i-1],records[i]});
}
}
for(auto it: p2p){
string name = it.first;
vector<pair<Person, Person>> vec = it.second;
cout<<name<<" "<<vec[0].first.date.substr(0,2)<<endl;
double sum = 0.0;
for(auto p:vec){
string start = p.first.date.substr(3);
string end = p.second.date.substr(3);
cout<<start<<" "<<end<<" "<<getMinute(start,end)<<" ";
double cost = getCost(start,end)/100.0;
sum += cost;
printf("$%.2f\n",cost);
}
printf("Total amount: $%.2f\n",sum);
}
return 0;
}
浙公网安备 33010602011771号