2010-03-09
過去問マラソン(#14):SRM154(続き)
過去問マラソン | |
![]()
Medium(500): ContestScore
初回投稿:
- 290.96 (28'52'')
#define sz(a) int((a).size())
#define pb push_back
#define all(c) (c).begin(),(c).end()
#define tr(c,i) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); i++)
#define rep(var,n) for(int var=0;var<(n);var++)
class ContestScore {
public:
vector <string> sortResults(vector <string> data) {
int n=sz(data);//0-50
vector<vector<double> > scores(n,vector<double>());
vector<string> groupnames(n);
int judges = 0;
rep(i,n){
istringstream ss(data[i]);
ss >> groupnames[i];
if (judges) {
rep(j,judges) { double tmp; ss >> tmp; scores[i].pb(tmp); }
} else {
while (!ss.eof()) { double tmp; ss >> tmp; scores[i].pb(tmp); judges++; }
}
}
vector<vector<int> > ranks(n,vector<int>(judges) );
rep(j,judges){
vector<pair<double,int> > jscores(n);
rep(i,n) jscores[i] = make_pair(-scores[i][j], i);
sort(all(jscores));
int lastrank = 1, rankcnt = 1; double lastscore = jscores[0].first;
vector<int> jranks(n);
rep(i,n) {
if (jscores[i].first == lastscore) {
jranks[ jscores[i].second ] = lastrank;
} else {
jranks[ jscores[i].second ] = rankcnt; lastrank = rankcnt;
}
rankcnt++; lastscore = jscores[i].first;
}
rep(i,n) ranks[i][j] = jranks[i];
}
vector<int> ranksum(n,0); vector<double> scoresum(n,0);
vector<pair<int,pair<double,string> > > thescore(n);
rep(i,n) {
rep(j,judges) {
ranksum[i] += ranks[i][j];
scoresum[i] += scores[i][j];
}
thescore[i] = make_pair(ranksum[i],make_pair(-scoresum[i],groupnames[i]));
}
sort(all(thescore));
vector<string> ans;
rep(i,n) {
stringstream ss;
ss << thescore[i].second.second << " " << thescore[i].first << " " << -thescore[i].second.first;
bool point=false;
tr(ss.str(),it){
if (*it == '.') {point=true;break;}
}
if (!point) ss << ".0";
ans.pb(ss.str());
}
return ans;
}
};
- failed system test
- 小数点以下第一位が0のときに「.0」を表示するようにしたつもりだったけど、サーバでは効いてなかった。(なぜだろう)
- その箇所を
char buf[256];
sprintf(buf, "%s %d %3.1f",
thescore[i].second.second.c_str(),
thescore[i].first,
-thescore[i].second.first);
ans.pb(buf);
- 別の問題が発生
FAILED (0.446 msec)
Expected: { "A 22 594.8","AA 34 483.7","AAA 34 466.2","AAAA 46 395.1","AAAAA 46 395.1","AAAAAA 48 387.6","AAAAAAA 48 387.6","AAAAAAAA 49 371.5","AAAAAAAAA 52 304.3","AAAAAAAAAA 54 348.6", }
Received: { "A 22 594.8","AA 34 483.7","AAA 34 466.2","AAAA 46 395.1","AAAAA 46 395.1","AAAAAAA 48 387.6","AAAAAA 48 387.6","AAAAAAAA 49 371.5","AAAAAAAAA 52 304.3","AAAAAAAAAA 54 348.6", }
- なにこれ
- rank合計もscore合計も同じ、で文字列比較でAAAAAA<AAAAAAAになるのが期待されるところ</li>
- sortを比較関数渡し型にしてみた
- score合計のところで異常。
最終投稿
#define sz(a) int((a).size())
#define pb push_back
#define all(c) (c).begin(),(c).end()
#define tr(c,i) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); i++)
#define rep(var,n) for(int var=0;var<(n);var++)
typedef pair<int,pair<int,string> > score_t;
#define make_score(R,S,N) make_pair(R,make_pair(S,N))
#define car first
#define cdr second
#define caar first.first
#define cdar first.second
#define cadr second.first
#define cddr second.second
bool cmp(score_t s1, score_t s2) {
if (s1.car < s2.car) return true;
if (s1.car > s2.car) return false;
if (s1.cadr > s2.cadr) return true;
if (s1.cadr < s2.cadr) return false;
return s1.cddr < s2.cddr;
}
class ContestScore {
public:
vector <string> sortResults(vector <string> data) {
int n=sz(data);//0-50
if (n==0) return vector<string>();
vector<vector<int> > scores(n,vector<int>());
vector<string> groupnames(n);
rep(i,n){
istringstream ss(data[i]);
ss >> groupnames[i];
while (!ss.eof()) {
double tmp; ss >> tmp;
scores[i].pb((int)(tmp*10 + 0.5));
}
}
int judges = sz(scores[0]);
vector<vector<int> > ranks(n,vector<int>(judges) );
rep(j,judges){
vector<pair<int,int> > jscores(n);
rep(i,n) jscores[i] = make_pair(-scores[i][j], i);
sort(all(jscores));
int lastrank = 1, rankcnt = 1; int lastscore = jscores[0].first;
vector<int> jranks(n);
rep(i,n) {
if (jscores[i].first == lastscore) {
jranks[ jscores[i].second ] = lastrank;
} else {
jranks[ jscores[i].second ] = rankcnt; lastrank = rankcnt;
}
rankcnt++; lastscore = jscores[i].first;
}
rep(i,n) ranks[i][j] = jranks[i];
}
vector<int> ranksum(n,0); vector<int> scoresum(n,0);
vector<score_t> thescore(n);
rep(i,n) {
rep(j,judges) {
ranksum[i] += ranks[i][j];
scoresum[i] += scores[i][j];
}
thescore[i] = make_pair(ranksum[i],make_pair(scoresum[i],groupnames[i]));
}
sort(all(thescore),cmp);
vector<string> ans;
rep(i,n) {
char buf[256];
sprintf(buf, "%s %d %3.1f",
thescore[i].cddr.c_str(),
thescore[i].car,
0.1 * thescore[i].cadr);
ans.pb(buf);
}
return ans;
}
};
- passed system test
- ふぅ
コメント
トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/n4_t/20100309