题目详情 - 1016 Phone Bills (25 分) (pintia.cn)
代码:
#include<bits/stdc++.h>
using namespace std;
struct Node {
string name, statue;
int month, day, hour, mintue, time;
};
bool cmp(Node a, Node b) {
return a.name != b.name ? a.name < b.name : a.time < b.time;
}
double Price(Node a, vector<double> rate){
double sum = rate[a.hour] * (double)a.mintue + rate[24] * (double)a.day * 60;
for (int i = 0; i < a.hour; ++i) {sum += rate[i] * 60;}
return sum / 100.0;
}
int main()
{
vector<double> rate(25);
for (int i = 0; i < 24; ++i) {
cin >> rate[i];
rate[24] += rate[i];
}
int N = 0;
char c;
cin >> N;
vector<Node> record(N);
for (int i = 0; i < N; ++i) {
cin >> record[i].name >> record[i].month >> c >> record[i].day >> c >> record[i].hour >> c >> record[i].mintue >> record[i].statue;
record[i].time = record[i].day * 24 * 60 + record[i].hour * 60 + record[i].mintue;
}
sort(record.begin(), record.end(), cmp);
map<string, vector<Node>> bill;
for (int i = 1; i < N; ++i) {
if (record[i].name == record[i - 1].name && record[i].statue == "off-line" && record[i-1].statue == "on-line") {
bill[record[i-1].name].push_back(record[i-1]);
bill[record[i].name].push_back(record[i]);
}
}
for (auto it : bill) {
vector<Node> temp = it.second;
cout << it.first;
printf(" %02d\n", temp[0].month);
double sum = 0;
for (int i = 1; i < temp.size(); i += 2) {
double price = Price(temp[i], rate) - Price(temp[i - 1], rate);
printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2lf\n", temp[i-1].day, temp[i-1].hour, temp[i-1].mintue, temp[i].day, temp[i].hour, temp[i].mintue, temp[i].time-temp[i-1].time, price);
sum += price;
}
printf("Total amount: $%.2lf\n", sum);
}
return 0;
}