1016.Phone Bills (25)…to be continued…
pat-al-1016
2017-02-16
坑见注释参考:《算法笔记:上机训练实战指南》机械工业出版社/** * pat-al-1016 * 2017-02-16 * Cpp version * Author: fengLian_s */ #include<stdio.h> #include<algorithm> #include<string.h> #define MAX 1010 using namespace std; struct RECORD { char name[25]; int month; int dd, hh, mm; bool flagOn;//false为off,true为on }record[MAX], tmp; int cost[25]; bool cmp(RECORD a, RECORD b) { if(strcmp(a.name, b.name) != 0) return strcmp(a.name, b.name) < 0;//坑,注意要用strcmp else if(a.dd != b.dd) return a.dd < b.dd; else if(a.hh != b.hh) return a.hh < b.hh; else if(a.mm != b.mm) return a.mm < b.mm; } void getAns(int on, int off, int& lastTime, double& money) { tmp = record[on]; while(tmp.dd < record[off].dd || tmp.hh < record[off].hh || tmp.mm < record[off].mm) { lastTime++; money += cost[tmp.hh]; tmp.mm++; if(tmp.mm == 60) { tmp.mm = 0; tmp.hh++; } if(tmp.hh == 24) { tmp.hh = 0; tmp.dd++; } } } int main() { freopen("in.txt", "r", stdin); int n; for(int i = 0;i < 24;i++) { scanf("%d", &cost[i]); } scanf("%d", &n); for(int i = 0;i < n;i++) { char tmpFlag[10]; scanf("%s%d:%d:%d:%d", record[i].name, &record[i].month, &record[i].dd, &record[i].hh, &record[i].mm); scanf("%s", tmpFlag); if(tmpFlag[1] == 'f') record[i].flagOn = false; else record[i].flagOn = true; } sort(record, record+n, cmp); // for(int i = 0;i < n;i++) // { // PRintf("%s %d:%d:%d:%d %d/n", record[i].name, record[i].month, record[i].dd, record[i].hh, record[i].mm, record[i].flagOn); // } int on = 0, off, next; while(on < n) { next = on; int flagPrint = 0; while(next < n && strcmp(record[on].name, record[next].name) == 0) { if(flagPrint == 0 && record[next].flagOn == true)//一开始对这一对判断有点疑问,比如true和false之间又隔了一个true呢?思考后发现如果又隔了一个true就相当于是认为第二个true才是这一对的开始,是不影响结果的,好奇妙啊 flagPrint = 1; else if(flagPrint == 1 && record[next].flagOn == false) flagPrint = 2; next++; } if(flagPrint < 2) { on = next; continue; } printf("%s %02d/n", record[on].name, record[on].month); double sumOfMoney = 0; while(on < next) { while(on + 1 < next && !(record[on].flagOn == true && record[on+1].flagOn == false)) { on++; } off = on+1; if(off == next)//坑:不要漏了这个判断 { on = next; break; } printf("%02d:%02d:%02d ", record[on].dd, record[on].hh, record[on].mm); printf("%02d:%02d:%02d ", record[off].dd, record[off].hh, record[off].mm); int lastTime = 0; double money = 0; getAns(on, off, lastTime, money); printf("%d $%.2lf/n", lastTime, money/100); sumOfMoney += money; on += 2; } printf("Total amount: $%.2lf/n", sumOfMoney/100); } return 0; }-TBC-
新闻热点
疑难解答