0
点赞
收藏
分享

微信扫一扫

UVA-207 PGA巡回赛的奖金 题解答案代码 算法竞赛入门经典第二版


​​GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版​​

这道题目本身不难,但是我做了很久才ac。代码很快就写出来了,但是细节太多,需要注意的地方太多了,导致一直wa。而且没有完整的样例输入和输出供参考。题目中那个不完整的样例甚至是错的!比如RD1写成了RDJ。题目本身也有些地方没有说清楚(可能是我英文不好没理解),比如犯规选手其实是要求排名的,而且第70名如果有多个选手也是要带T和计算奖金的。第一名多于一个也没有问题。

我一开始还没想到晋级了(cut),但是在最后排名时却排到70名之外,导致不能获得奖金。因此不只有犯规和业余选手不能获得奖金的。还有很多需要注意的地方,网上有其他博客有讲,搜一下就好了。

最后还有我用的样例供参考:(不完全符合条件,成绩起始于21和22个字符都有,但如果不用某些卡数字位置读入的方法,是可以测试的)

AC代码

#include<iostream>
#include<string>
#include<vector>
#include<sstream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include <iomanip>
#define PRIZENUM 70
#define NAMELEN 21
using namespace std;

struct Player {
string name;
int rd[4];
int total;
double money;
bool amateur;
int place;
bool t;
bool hasMoney;
int dqi;
};

double sum;
double per[PRIZENUM];
vector<Player> v;

void readPlayer(Player &p, string sline) {
string s;
int i, j, rd;
int namelen = NAMELEN - 1;
s = sline.substr(0, namelen);
p.name = s;
if(strchr(s.c_str(), '*')) {
p.amateur = true;
} else {
p.amateur = false;
}
sline = sline.substr(namelen, sline.length() - namelen);
stringstream ss(sline);
p.total = 0;
p.place= 0;
p.t = false;
p.hasMoney = false;
p.dqi = -1;
p.money = 0;
memset(p.rd, 0, sizeof(p.rd));
for(i = 0; i < 4 && (ss >> s); ++i) {
if(s == "DQ") {
break;
}
p.rd[i] = stoi(s);
p.total += p.rd[i];
}
if(i < 4) {
p.rd[i] = -1;
p.dqi = i;
}
}

void printOne(string s, int len, char c = ' ') {
cout << s;
len = len - s.length();
while(len-- > 0) {
cout << c;
}
}

void printOne(int num, int len, char c = ' ') {
ostringstream ss;
ss << num;
string s = ss.str();
printOne(s, len, c);
}


void printOrder(int i) {
if(v[i].dqi != -1) {
printOne("", 10);
return;
}
ostringstream ss;
ss << v[i].place;
string s = ss.str();
if(v[i].t) {
s = s + "T";
}
printOne(s, 10);
}

void print(int n) {
int i, j;
cout << "Player Name Place RD1 RD2 RD3 RD4 TOTAL Money Won" << endl;
printOne("", NAMELEN + 50, '-');
cout << endl;
for(i = 0; i < v.size(); ++i) {
printOne(v[i].name, NAMELEN);
printOrder(i);
for(j = 0; j < 4; ++j) {
if(v[i].dqi == j) {
printOne("", 5*(4-j));
break;
} else {
printOne(v[i].rd[j], 5);
}
}
if(v[i].dqi != -1) {
cout << "DQ";
} else if(v[i].amateur || !v[i].hasMoney) {
cout << v[i].total;
} else {
printOne(v[i].total, 10);
// printf("$%9.2lf", v[i].money);
cout << "$" << right << setw(9) << fixed << setprecision(2) << v[i].money;
}
cout << endl;
}
if(n != 0) {
cout << endl;
}
}

bool cmpCut(const Player & a, const Player & b) {
if(a.dqi < 2 && a.dqi != -1) return false;
if(b.dqi < 2 && b.dqi != -1) return true;
int suma = a.rd[0] + a.rd[1];
int sumb = b.rd[0] + b.rd[1];
return suma < sumb;
}

int sortCut() {
int i, j, suma;
sort(v.begin(), v.end(), cmpCut);
for(i = 0; i < PRIZENUM && i < v.size(); ++i) {
if(v[i].dqi < 2 && v[i].dqi != -1) {
return i;
}
}
suma = v[i-1].rd[0] + v[i-1].rd[1];
while(i < v.size()) {
if(v[i].dqi < 2 && v[i].dqi != -1) {
break;
}
if(suma != v[i].rd[0] + v[i].rd[1]) {
break;
}
++i;
}
return i;
}

bool cmpFinal(const Player & a, const Player & b) {
if(a.dqi != -1 && b.dqi != -1) {
if(a.dqi != b.dqi) {
return a.dqi > b.dqi;
}
if(a.total != b.total) {
return a.total < b.total;
}
return a.name < b.name;
}
if(a.dqi != -1) return false;
if(b.dqi != -1) return true;
if(a.total != b.total) {
return a.total < b.total;
}
return a.name < b.name;
}

void setPlace() {
int i;
for(i = 0; i < v.size(); ++i) {
if(v[i].dqi != -1) {
return;
}
if(i != 0 && v[i].total == v[i-1].total) {
v[i].place = v[i-1].place;
} else {
v[i].place = i + 1;
}
}
}

void setMoney() {
int i = 0, j, k;
int num, pnum = 0;
double money;
while(i < v.size() && pnum < PRIZENUM) {
if(v[i].dqi != -1) {
return;
}
if(v[i].amateur) {
++i;
continue;
}
num = 1;
money = per[pnum++];
v[i].hasMoney = true;
for(j = i+1; j < v.size() && v[j].place == v[i].place; ++j) {
if(v[j].dqi != -1) {
break;
}
if(v[j].amateur) continue;
++num;
if(pnum < PRIZENUM) {
money += per[pnum++];
}
v[j].hasMoney = true;
}
money = money * sum / num / 100;
for(k = i; k < j; ++k) {
if(v[k].amateur) continue;
if(v[k].hasMoney == false) continue;
v[k].money = money;
if(num > 1) {
v[k].t = true;
}
}
i = j;
}
}

int main() {
int n, i, j, k;
int num;
string sline, s;
cin >> n;
while(n--) {
v.clear();
cin >> sum;
for(i = 0; i < PRIZENUM; ++i) {
cin >> per[i];
}
cin >> num;
getline(cin, sline);
for(i = 0; i < num; ++i) {
Player p;
getline(cin, sline);
readPlayer(p, sline);
v.push_back(p);
}
int cut = sortCut();
v.resize(cut);
sort(v.begin(), v.end(), cmpFinal);
setPlace();
setMoney();
print(n);
}
return 0;
}

我用的样例:

1

1000009.99
17.6000
17.5000
17.4000
17.3000
17.2000
17.1000
17.0000
16.9000
16.8000
16.6000
16.6000
16.5000
16.4000
16.3000
16.2000
16.1000
16.0000
15.9000
15.8000
15.7000
15.6000
15.5000
15.4000
15.3000
15.2000
15.1000
15.0000
14.9000
14.8000
14.7000
14.6000
14.5000
14.4000
14.3000
14.2000
14.1000
14.0000
13.9000
13.8000
13.7000
13.6000
13.5000
13.4000
13.3000
13.2000
13.1000
13.0000
12.9000
12.8000
12.7000
12.6000
12.5000
12.4000
12.3000
12.2000
12.1000
12.0000
11.9000
11.8000
11.7000
11.6000
11.5000
11.4000
11.3000
6.8000
4.8000
3.8000
2.8000
1.8000
0.8000
130
WALLY WEDGE 70 70 71 71
WALLY WEDGE* 70 70 71 72
SANDY LIE DQ
SID SHANKER 90 99 62 61
SID SHANKER1 90 99 62 61
JIMMY ABLE 99 99 80 DQ
HENRY HACKER 77 70 70 70
TOMMY TWO IRON 71 72 72 72
BEN BIRDIE 70 74 72 72
NORMAN NIBLICK 72 72 72 72
LEE THREE WINES 99 99 99 90
JOHqw MELAVO* 10 99 99 91
JOHNY MELAVO 11 99 99 91
JOHNY MELAVO 12 99 99 91
JOHNY MELAVO 12 99 99 91
JOHNY MELAVO1 14 99 99 92
JOHNY MELAVO2 15 99 99 93
JOHNY MELAVO2 15 99 99 93
JOHNY MELAVO2 15 99 99 93
JOHNY MELAVO2 15 99 99 93
JOHNY MELAVO* 15 99 99 93
JOHNY MELAVO* 15 99 99 93
JOHNY MELAVO* 15 99 99 93
JOHNY MELAVO* 15 99 99 93
JOHNY MELAVO* 90 99 99 94
JOHNY MELAVO* 90 99 99 94
JOHNY MELAVO* 92 99 99 94
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 99
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
JOHNY MELAVO4 95 99 99 98
EDDIE EAGLE1 11 99 11 DQ
EDDIE EAGLE 11 99 DQ
EDDIE EAGLE1 11 99 DQ
EDDIE EAGLE0 11 99 DQ

举报

相关推荐

0 条评论