现在的位置: 首页 > 综合 > 正文

UVa Problem Solution: 10138 – CDVII

2013年08月22日 ⁄ 综合 ⁄ 共 3600字 ⁄ 字号 评论关闭

Sort the the photo records according to license number, then time. If a license has no cost, do not output it.

Code:

  1. /*************************************************************************
  2.  * Copyright (C) 2008 by liukaipeng                                      *
  3.  * liukaipeng at gmail dot com                                           *
  4.  *************************************************************************/
  5. /* @JUDGE_ID 00000 10138 C++ "CDVII" */
  6. #include <algorithm>
  7. #include <cmath>
  8. #include <cstring>
  9. #include <deque>
  10. #include <fstream>
  11. #include <iostream>
  12. #include <list>
  13. #include <map>
  14. #include <queue>
  15. #include <set>
  16. #include <stack>
  17. #include <string>
  18. #include <vector>
  19. using namespace std;
  20.      
  21. int const linesize = 256;
  22. int const recordcount = 1000;
  23.           
  24. struct record
  25. {
  26.   char license[21];
  27.   int month;
  28.   int day;
  29.   int hour;
  30.   int minute;
  31.   char status[6];
  32.   int location;
  33. };
  34. struct recordcmp
  35. {
  36.   bool operator()(record const& r1, record const& r2)
  37.   {
  38.     int c = strcmp(r1.license, r2.license);
  39.     if (c < 0) return true;
  40.     if (c > 0) return false;
  41.     if (r1.day < r2.day) return true;
  42.     if (r1.day > r2.day) return false;
  43.     if (r1.hour < r2.hour) return true;
  44.     if (r1.hour > r2.hour) return false;
  45.     if (r1.minute < r2.minute) return true;
  46.     if (r1.minute > r2.minute) return false;
  47.     return false;
  48.   }
  49. };
  50. struct bill
  51. {
  52.   char *license;
  53.   int cost;
  54. };
  55. int get_bills(int *fares, record *records, int nrecords, bill *bills)
  56. {
  57.   sort(records, records + nrecords, recordcmp());
  58.   int nbills = 0;
  59.   for (int i = 0; i < nrecords;) {
  60.     char *license = records[i].license;
  61.     bool entered = false;
  62.     int cost = 0;
  63.     for (; i < nrecords && strcmp(license, records[i].license) == 0; ++i) {
  64.       if (!entered) { 
  65.         if (records[i].status[1] == 'n') {
  66.           entered = true;
  67.         } else continue;
  68.       }
  69.       if (entered) {
  70.         if (records[i].status[1] == 'x') {
  71.           entered = false;
  72.           cost += 100 + fares[records[i-1].hour] * 
  73.             abs(records[i].location - records[i-1].location);
  74.         } else continue;
  75.       } 
  76.     }
  77.     if (cost > 0) {
  78.       cost += 200;
  79.       bills[nbills].license = license;
  80.       bills[nbills].cost = cost;
  81.       ++nbills;
  82.     }
  83.   }
  84.   return nbills;
  85. }
  86. int main(int argc, char *argv[])
  87. {
  88. #ifndef ONLINE_JUDGE
  89.   freopen((string(argv[0]) + ".in").c_str(), "r", stdin);
  90.   freopen((string(argv[0]) + ".out").c_str(), "w", stdout);
  91. #endif
  92.   int ncases;
  93.   scanf("%d/n/n", &ncases);
  94.   while (ncases-- > 0) {
  95.     char buf[linesize];
  96.     fgets(buf, linesize, stdin);
  97.     int fares[24];
  98.     sscanf(buf, "%d %d %d %d %d %d %d %d %d %d %d "
  99.            "%d %d %d %d %d %d %d %d %d %d %d %d %d/n"
  100.            &fares[0], &fares[1], &fares[2], &fares[3], &fares[4], 
  101.            &fares[5], &fares[6], &fares[7], &fares[8], &fares[9], 
  102.            &fares[10], &fares[11], &fares[12], &fares[13], &fares[14], 
  103.            &fares[15], &fares[16], &fares[17], &fares[18], &fares[19], 
  104.            &fares[20], &fares[21], &fares[22], &fares[23]);
  105.     record records[recordcount];
  106.     int nrecords = 0;
  107.     for (; fgets(buf, linesize, stdin) && buf[0] != '/n'; ++nrecords) {
  108.       sscanf(buf, "%s %2d:%2d:%2d:%2d %s %d/n"
  109.              records[nrecords].license, &records[nrecords].month, 
  110.              &records[nrecords].day, &records[nrecords].hour, 
  111.              &records[nrecords].minute, records[nrecords].status,
  112.              &records[nrecords].location);
  113.     }
  114.     bill bills[recordcount];
  115.     int nbills = get_bills(fares, records, nrecords, bills);
  116.     for (int i = 0; i < nbills; ++i) {
  117.       printf("%s $%d.%02d/n", bills[i].license, bills[i].cost / 100, 
  118.              bills[i].cost % 100);
  119.     }
  120.     if (ncases > 0) putchar('/n');
  121.   }
  122.   return 0;
  123. }

抱歉!评论已关闭.