题目

计算每个人的电话费用


解法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;
}