您的位置:首页 > 其它

UVa Problem Solution: 10258 - Contest Scoreboard

2008-11-06 20:03 1226 查看
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:
/*************************************************************************
* Copyright (C) 2008 by liukaipeng *
* liukaipeng at gmail dot com *
*************************************************************************/

/* @JUDGE_ID 00000 10258 C++ "Contest Scoreboard" */

#include <algorithm>
#include <iostream>
#include <iterator>
#include <limits>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

struct submission
{
int contestant;
int problem;
int time;
char status;
};

bool operator>>(istream& is, submission& sbm)
{
string line;
getline(is, line);
if (!line.empty()) {
stringstream ss;
ss << line;
ss >> sbm.contestant
>> sbm.problem
>> sbm.time
>> sbm.status;
return true;
} else {
return false;
}
}

struct submissioncmp
{
bool operator()(submission const& s1, submission const& s2)
{
return s1.contestant < s2.contestant ? true :
s1.contestant > s2.contestant ? false :
s1.problem < s2.problem ? true :
s1.problem > s2.problem ? false :
s1.time < s2.time;
}
};

struct score
{
int contestant;
int solved;
int penalty;
};

void operator<<(ostream& os, score const& scr)
{
cout << scr.contestant << ' '
<< scr.solved << ' '
<< scr.penalty << '/n';
}

struct scorecmp
{
bool operator()(score const& s1, score const& s2)
{
return s1.solved > s2.solved ? true :
s1.solved < s2.solved ? false :
s1.penalty < s2.penalty ? true :
s1.penalty > s2.penalty ? false :
s1.contestant < s2.contestant;
}
};

void compute_scores(vector<submission>& submissions,
vector<score>& scores)
{
stable_sort(submissions.begin(), submissions.end(), submissioncmp());
for (int i = 0, size = submissions.size(); i < size; ) {
score scr = {submissions[i].contestant, 0, 0};
for (; i < size && scr.contestant == submissions[i].contestant; ) {
int problem = submissions[i].problem;
int penalty = 0;
bool solved = false;
for (; i < size && scr.contestant == submissions[i].contestant &&
problem == submissions[i].problem; ++i) {
char status = submissions[i].status;
if (!solved) {
if (status == 'C') {
solved = true;
penalty += submissions[i].time;
} else if (status == 'I') {
penalty += 20;
}
}
}
if (solved) {
scr.solved += 1;
scr.penalty += penalty;
}
}
scores.push_back(scr);
}
sort(scores.begin(), scores.end(), scorecmp());
}

int main(int argc, char *argv[])
{
#ifndef ONLINE_JUDGE
string name = argv[0];
freopen((name + ".in").c_str(), "r", stdin);
freopen((name + ".out").c_str(), "w", stdout);
#endif

int ncases;
cin >> ncases;
cin.ignore(numeric_limits<streamsize>::max(), '/n');
cin.ignore(numeric_limits<streamsize>::max(), '/n');
while (ncases-- > 0) {
submission sbm;
vector<submission> submissions;
while (cin >> sbm) submissions.push_back(sbm);

vector<score> scores;
compute_scores(submissions, scores);

copy(scores.begin(), scores.end(), ostream_iterator<score>(cout));
if (ncases > 0) cout << '/n';
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: