UVa Problem Solution: 10258 - Contest Scoreboard

来源:互联网 发布:淘宝爆款知乎 编辑:程序博客网 时间:2024/05/22 12:35

Understanding the problem specification is the very key to solve it:
1) ... penalty time is computed ... submission received prior to the correct solution:
  So if the AC submission (C) is before any other submission,  you can ignore the later submissions to count penalty stuffs.
2) ... lines of input are in the order in which submissions were received:
  So for the input
  1 1 10 C
  1 1 10 I
  you should not count penalty... while
  1 1 10 I
  1 1 10 C
  you should count penalty.
   
Code:
  1. /*************************************************************************
  2.  * Copyright (C) 2008 by liukaipeng                                      *
  3.  * liukaipeng at gmail dot com                                           *
  4.  *************************************************************************/
  5. /* @JUDGE_ID 00000 10258 C++ "Contest Scoreboard" */
  6. #include <algorithm>
  7. #include <iostream>
  8. #include <iterator>
  9. #include <limits>
  10. #include <string>
  11. #include <sstream>
  12. #include <vector>
  13. using namespace std;
  14.     
  15. struct submission
  16. {
  17.   int contestant;
  18.   int problem;
  19.   int time;
  20.   char status;
  21. };
  22. bool operator>>(istream& is, submission& sbm)
  23. {
  24.   string line;
  25.   getline(is, line);
  26.   if (!line.empty()) {
  27.     stringstream ss;
  28.     ss << line;
  29.     ss >> sbm.contestant 
  30.        >> sbm.problem 
  31.        >> sbm.time 
  32.        >> sbm.status;
  33.     return true;
  34.   } else {
  35.     return false;
  36.   }
  37. }
  38. struct submissioncmp
  39. {
  40.   bool operator()(submission const& s1, submission const& s2)
  41.   {
  42.     return s1.contestant < s2.contestant ? true :
  43.       s1.contestant > s2.contestant ? false : 
  44.       s1.problem < s2.problem ? true : 
  45.       s1.problem > s2.problem ? false : 
  46.       s1.time < s2.time;
  47.   }
  48. };
  49. struct score
  50. {
  51.   int contestant;
  52.   int solved;
  53.   int penalty;
  54. };
  55. void operator<<(ostream& os, score const& scr)
  56. {
  57.   cout << scr.contestant << ' '
  58.        << scr.solved << ' '
  59.        << scr.penalty << '/n';
  60. }
  61. struct scorecmp
  62. {
  63.   bool operator()(score const& s1, score const& s2)
  64.   {
  65.     return s1.solved > s2.solved ? true :
  66.       s1.solved < s2.solved ? false :
  67.       s1.penalty < s2.penalty ? true :
  68.       s1.penalty > s2.penalty ? false :
  69.       s1.contestant < s2.contestant;
  70.   }
  71. };
  72.         
  73. void compute_scores(vector<submission>& submissions,
  74.                     vector<score>& scores)
  75. {
  76.   stable_sort(submissions.begin(), submissions.end(), submissioncmp());
  77.   for (int i = 0, size = submissions.size(); i < size; ) {
  78.     score scr = {submissions[i].contestant, 0, 0};
  79.     for (; i < size && scr.contestant == submissions[i].contestant; ) {
  80.       int problem = submissions[i].problem;
  81.       int penalty = 0;
  82.       bool solved = false;
  83.       for (; i < size && scr.contestant == submissions[i].contestant &&
  84.              problem == submissions[i].problem; ++i) {
  85.         char status = submissions[i].status;
  86.         if (!solved) {
  87.           if (status == 'C') {
  88.             solved = true;
  89.             penalty += submissions[i].time;
  90.           } else if (status == 'I') {
  91.             penalty += 20;
  92.           }
  93.         }
  94.       }
  95.       if (solved) {
  96.         scr.solved += 1;
  97.         scr.penalty += penalty;
  98.       }
  99.     }
  100.     scores.push_back(scr);
  101.   }
  102.   sort(scores.begin(), scores.end(), scorecmp());
  103. }
  104. int main(int argc, char *argv[])
  105. {
  106. #ifndef ONLINE_JUDGE
  107.   string name = argv[0];
  108.   freopen((name + ".in").c_str(), "r", stdin);
  109.   freopen((name + ".out").c_str(), "w", stdout);
  110. #endif
  111.   int ncases;
  112.   cin >> ncases;
  113.   cin.ignore(numeric_limits<streamsize>::max(), '/n');
  114.   cin.ignore(numeric_limits<streamsize>::max(), '/n');
  115.   while (ncases-- > 0) {
  116.     submission sbm;
  117.     vector<submission> submissions;
  118.     while (cin >> sbm) submissions.push_back(sbm);
  119.     vector<score> scores;
  120.     compute_scores(submissions, scores);
  121.     copy(scores.begin(), scores.end(), ostream_iterator<score>(cout));
  122.     if (ncases > 0) cout << '/n';
  123.   }
  124.   return 0;
  125. }

原创粉丝点击