UVa Problem Solution: 10258 - Contest Scoreboard


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. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值