例题5-10 PGA巡回赛的奖金 UVa207

算法竞赛入门经典(第2版) 第5C++与STL入门

题5-10 PGA巡回赛的奖金  UVa207

http://blog.csdn.net/fanesemyk/article/details/73655739该文写得不错,建议阅读。2017-6-26

感悟。

1、从网站下载英文原题,重点在看输入输出数据与格式。

2、英文原题看起来,篇幅较多,有一两个卡壳的地方,与书中中文比对,个别理解还是有一定偏差的。

3、决定编程时还是放弃中文,以英文题目为参考。

4、英文题目的重心还是看懂输入输出数据关系,不明白之处再对照英文内容进行比对,这样题意的理解就能慢慢接近原文所要表达的意思。

5、带着问题阅读英文原题,每一次都能加深理解。解决了样例中有140名选手,但打印只有74名,No player who failed to make the 36-hole cut is listed in the output.没进半决赛的选手不打印;解决了DQ选手的排序问题,the order among disqualified players isunimportant.顺序无所谓;解决了获奖选手同名次排序问题,If there’s still a tie, orderthem in alphabetical order.按字母顺序。同时学习了一些英文俚语,同名次,still a tie;进入决赛make the 36-hole cut。比较有意思。

6、每一名选手的描述,采用结构体,四轮中得分,因涉及DQ,没办法只能采取字符串,闹心啊。奖金的对齐方式;如何有效的加上'T'。

7、再次处理到大字符串问题,此题工作量不会比题4-6 师兄帮帮忙 UVa12412 少,估计有得折腾了。

8、该题还有一个问题,要解决输入中的空行。

9、通过http://www.cppblog.com/Sandywin/archive/2007/07/13/27984.html学习了stringstream用法:

重复利用stringstream对象

如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法;

在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。

10、为了方便测试,将样例1的输入数据充实,这样方便测试,在测试读取选手信息时,费了些周折,一看原文,对选手信息的输入数据格式有严格要求,按照输入格式要求,重新设计了测试数据(网页上体现不出,请大家用下面测试数据时,注意重排格式):

/*Characters 1–20: Player name
Characters 21–23: Round 1 score (first 18 holes)
Characters 24–26: Round 2 score (second 18 holes)
Characters 27–29: Round 3 score (third 18 holes)
Characters 30–32: Round 4 score (fourth 18 holes)*/

1

1000000.00
18
10.8
6.8
4.8
2.8
1.8
1.7
1.6
1.5
1.49
1.48
1.47
1.46
1.45
1.44
1.43
1.42
1.41
1.4
1.39
1.38
1.37
1.36
1.35
1.34
1.33
1.32
1.31
1.3
1.29
1.28
1.27
1.26
1.25
1.24
1.23
1.22
1.21
1.2
1.19
1.18
1.17
1.16
1.15
1.14
1.13
1.12
1.11
1.1
1.09
1.08
1.07
1.06
1.05
1.04
1.03
1.02
1.01
1
0.99
0.98
0.97
0.96
0.95
0.94
0.93
0.92
0.91
0.202
0.2
140
abcWALLY WEDGE      70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
abbWALLY WEDGE      70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
aabWALLY WEDGE      70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
aaaWALLY WEDGE      70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      
SID SHANKER*        90 99 62 61
SID SHANKER*        90 99 62 62
JIMMY ABLE          69 73 80 DQ
WALLY WEDGE         70 70 70 71
WALLY WEDGE         70 70 70 70
SANDY LIE           80 DQ      


11、编写一个功能测试一个功能,看似很耗时,但编写的人会很有信心,尤其在代码量比较大,功能比较多时,特别有用。

12、每个round的分数应该不会超过两位数,最大值为99,查英文原题,没有明确说明,但本人从格式角度(每轮分数占三个字符,最后一个字符留给空格)猜测应该如此。

13、根据12、将总分DQ定义为999,这样方便处理。

14、通过程序测试了string中的compare函数,s1.compare(s2):s1字母序等于s2,值为0;s1字母序大于s2,值为正数;s1字母序小于s2,值为负数。

15、选手名次处理,第一步先用冒泡排序,自小到大排序;第二步处理同名次;第三步处理同名次安字母序排序。

16、在按字母序排序过程中的收获,排序自小到大:数字,大写字母,小写字母。ascii表:0-9(48-57),A-Z(65-90),a-z(97-122)。

17、根据https://zhidao.baidu.com/question/216734821.html,学习了浮点数的对齐方式,printf("%6.2f",a);

18、准备先设置奖金分配,之后根据奖金分配,设定name后的'T',突然想到分配奖金的人少于70,如何处理,查看英文原文:8) If disqualification reduces the field to less than 70 players, the money for the last and any other
places not covered is not allocated. For example, if exactly 70 players make the cut but three of
them are disqualified, then the tournament simply pays 67 places.多出多的奖金不分配。

19、根据http://www.cnblogs.com/zpcdbky/p/4471454.html学习string中的find函数用法:

若查找成功,返回按查找规则找到的第一个字符或子串的位置;若查找失败,返回npos,即-1(打印出来为4294967295)。

20、经程序验证,npos也可用string::npos引用,打印出来的值确为4294967295

21、分配奖金人数超过70人,10) Only the low 70 non-amateur places and ties earn prize money. For example, if 75 players make the 36-hole cut, it is possible for 5 of them not to earn prize money, assuming none of the players
making the cut are amateurs.获奖人数最多70人。理解有误。应该是可以超过70人,当然前提是包括并列的。

22、一开始准备用分配的奖金来确定职业选手业余选手,编写的过程中,发现程序要考虑的东西太多,越写越乱,推倒重来,准备在选手排序里直接标记好职业、业余,并列。

23、对业余选手的奖金情况,排名情况,存在疑惑,重读英文原题:9) Amateur golfers may play in professional tournaments but can win no money. Any prize money “won” by an amateur is allocated to the next lower position. For example, if an amateur has placed third in a tournament, then third place money goes to the fourth place finisher, and fourth place money goes to the fifth place finisher, etc.意思就是业余选手参与排名,但不参与奖金分配。

24、细节好多,一点一点攻克吧。

25、硬着头皮把数据处理部分编写完成,发现打印部分也不轻松。

26、在http://vjudge.net提交Runtime error,真是没想到啊。

27、在http://blog.csdn.net/crazysillynerd/article/details/43763003找了些测试数据。

28、在http://blog.csdn.net/wcr1996/article/details/44516421找到代码,在http://vjudge.net提交AC,开始测试这个AC程序。

29、本题有一个很明显的问题,没有完整的输入输出样例,这是最致命的问题,本题的呈现形式很有问题。

30、简单修改,http://vjudge.net提交Runtime error,可以断定,是在选手的信息读取时出的问题,读取格式不能按位置写死,找个AC代码读读。

31、一番寻找,找到了比较接近的http://blog.csdn.net/crazysillynerd/article/details/43763003代码,先提交Wrong answer,看来没有阅读的必要了。

32、找不到代码接近的,那只能找个能AC的代码来阅读,http://blog.csdn.net/aozil_yang/article/details/50543965提交AC,主要放在选手信息读取上。

33、英文原题需要刊物,样例输出部分RDJ改成RD1

34、重读书中中文,才发现,读英文时,有一个重要信息没看到:All players who are not disqualified will have four 18-hole scores listed. (Even though in an actual tournament, players who do not make the cut do not get to play the last two rounds of the tournament, for the purposes of this program all players who are not disqualified will have four 18-hole scores listed.)为了程序的目的,没有取消资格的都会有四轮成绩,虽然实际情况是没有晋级的只有两轮成绩。要开始改代码了,之前误以为只要有三轮成绩就算进入决赛。本题的意思是先比前两轮,前70名进入决赛,再比总分,前70名职业选手有奖金。

35、在想晋级决赛的人数少于70人,如何处理,一翻中文书,提到,输入保证至少有70个人晋级。翻英文原题,找到印证:Assume that at least 70 players will make the 36-hole cut.

36、经过一番查找,修改了Runtime error错误,两个地方:一是固定格式按精确字符位置读取选手信息,没有变通性;二是有效选手个数,忘记了每一格案例时,必须初始化为零。找到问题后,进行修改,提交,很高兴Wrong answer,意味着能进入核心代码处理的修改了。

37、在输入输出测试过程中,发现业余选手也能拿第一名,可惜拿不到钱。程序这点没考虑,马上修改。

38、一直对string中的compare缺乏认识,s1.compare(s2)==0相等; s1.compare(s2)<0 串s1字母序列小于s2;s1.compare(s2)>0串s1字母序列大于s1。if(s1.compare(s2)),串s1小于s2或串s1大于s2均成立。在此处也调了好长时间。

39、面上看起来样例已通过,提交WA,经对拍发现,如无奖金,此处应该什么都没有,而不是补空格。

40、输出格式去除多余空格后,提交WA,经对拍发现,奖金的小数点后第二位有略微的差异。

41、找到http://www.lai18.com/content/1906907.html代码,提交AC,马上进行对比,发现差异在于本人用float,此代码用double,马上将程序中的float改成double,发现小数点后第二位,能对上了,提交WA。

42、一直WA,经过对拍,将焦点放在DQ选手的顺序上,英文原题the order among disqualified players is
unimportant.并不是说DQ选手的顺序可以随意排,经观察对拍程序的输出数据,发现DQ选手,先排只有三个的成绩,从小到大,再排只有两个的成绩,从小到大。

43、修改,提交WA,经对拍,发现有些数据在读取时,被丢弃,也就是程序中的29改成28后,错误改正,测试了5组数据,发现没问题,提交WA.

44、测试了全部的35组数据,发现对拍有问题,查找中,发现进入决赛的选手,只有前70名的职业选手能获奖金,此处疏忽了,修改,提交WA,有个小插曲,http://vjudge.net出现submit failed,只好去https://uva.onlinejudge.org/提交,WA。

45、再经对拍,发现拿奖金人数超过70人后,之后的名次不需要出现加字母'T'了。修改,提交WA

46、经对拍,发现DQ选手,同轮次(只有两轮成绩)且同分时,没有按字母序排序。查到问题for(j=i+1;j<=num;j++){//开始j

47、经对拍,发现获奖选手金额,最后一位个别例子有略微偏差,加上eps,经对拍,35组样例全通过,提交WA。

48、还有什么问题???准备开始读https://uva.onlinejudge.org/提交AC程序的代码。

49、猜测可能DQ值设置999太小,果断设置9999999,提交WA。

50、猜测输出格式,总分可能太具体,两位数,三位数,通过字符转换,写成通式形式,提交WA。

51、暂时搁置2016-12-4 21:24


你可能感兴趣的:(C++与STL入门)