这个题真是快把自己折磨疯了,在学校因为要复习,折腾了10天才AC,结果电脑出了点问题代码数据全部丢失,放假后又写了一遍,结果不断RE一天,唉!

这个题的题意就不说了,紫书上说的很详细了,关键是一点,什么时候分配奖金结束,是等那70个奖金比例全部分配结束后就不分了,哪怕最后一个比例分给了10个并列的,也只分一个,后面就不分了(只要让sum_mon加0就行了!)

整体思路:

1.开一个结构体记录运动员的:4个成绩(dq[5]),姓名(name),奖金(money),名次(place),是否是专业运动员(is_pro),是否输出T(is_T),和前两句的分数总和(all_2),前四局的分数总和(all_4)。

因为输入分数会有字母DQ,不妨设DQ为一个常量99999,这样排序时自动到后面去了

2.输入完成后就是各种排序

3.处理名次和奖金,先找重复的,在给这些重复的定名次和奖金

4.输出结果时,找出各种情况的相同点,来减少代码量!

技巧:

1.将DQ设置为一个很大的常量,让正常分数达不到这个值。

2.读取名字可以用fgets()来读,控制指定的长度(20个字符)。(记得最后在用fgets吃掉换行!)

3.直接用memset给结构体进行初始化为0.(为了简便,将一些改动小的默认为0.例如是否为专业运动员)

4.将比例数值大于70的那些运动员自动设为非职业运动员,这样输出可以直接判断是否为职业运动员来进行输出奖金。

注意:

1.千万注意好访问运动员(结构体)的个数,不要非法访问内存。(RE一天的原因T_T !)

2.在一个奖金平分时会除以个数,注意好别除以0

3.注意奖金要加上精度控制(1e-8就可以了)

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 200;
const int maxt = 50;
const int DQ = 999999;
const double eps = 1e-8;
struct player
{char name[maxt];double money;int place,all_2,all_4,dq[5];bool is_pro,is_T;
}players[maxn];
int rev_len(int k){int sum = 0;while(k!=0){k/=10;sum++;}return sum;
}
bool cmp1(const player&a,const player&b){if (a.all_2 != b.all_2)return a.all_2 < b.all_2;return strcmp(a.name,b.name)<0;
}
bool cmp2(const player&a,const player&b){if (a.all_4!=b.all_4)return a.all_4<b.all_4;return strcmp(a.name,b.name) < 0;
}
bool cmp3(const player&a,const player&b){int suma=0,sumb=0;for (int i = 0; i < 4;++i)if (a.dq[i]==DQ){suma=i;break;}for (int i = 0; i < 4;++i)if (b.dq[i]==DQ){sumb=i;break;}if (suma!=sumb)return suma>sumb;if(a.all_4!=b.all_4)return a.all_4<b.all_4;return strcmp(a.name,b.name)<0;
}
int main()
{//freopen("out.txt","w",stdout);int T,n;double prot[maxn],money_all;scanf("%d",&T);{while(T--){memset(players,0,sizeof(players));memset(prot,0,sizeof(prot));scanf("%lf",&money_all);for (int i = 0; i < 70; ++i)scanf("%lf",&prot[i]);scanf("%d",&n);getchar();for (int i = 0; i < n; ++i){fgets(players[i].name,20,stdin);if (!strchr(players[i].name, '*'))players[i].is_pro=true;for (int j = 0; j < 4; ++j){int flag = 0;if (!scanf("%d",&players[i].dq[j])){players[i].dq[j] = DQ;flag = 1;}if (j<2)players[i].all_2+=players[i].dq[j];players[i].all_4+=players[i].dq[j];if (flag)break;}char ch[45];fgets(ch,40,stdin);}sort (players,players+n,cmp1);int pos=0,pos2=0;while(pos < min(n,70) && players[pos].all_2 < DQ)++pos;while(pos < n && players[pos].all_2 == players[pos-1].all_2 && players[pos].all_2 < DQ)++pos;sort(players,players+pos,cmp2);while(pos2 < n && pos2 <= pos && players[pos2].all_4 < DQ)++pos2;while(pos2 < n && players[pos2].all_4 == players[pos2-1].all_4 && players[pos2].all_4<DQ)++pos2;if (pos!=pos2)sort(players+min(pos,pos2),players+max(pos,pos2),cmp3);int rak=1,cur=0,pos3,cont3=0;while(cur < min(pos,pos2) ){int sum=0;double sum_mon=0;for (pos3 = cur; players[pos3].all_4==players[cur].all_4;++pos3){if (players[pos3].is_pro){sum++;sum_mon+=prot[cont3++];}}if (sum)sum_mon/=sum;else sum_mon/=100;for (int i = cur; i < pos3; ++i){players[i].place=rak;if (players[i].is_pro && sum)players[i].money=sum_mon*money_all/100.0+eps;if(players[i].is_pro && sum > 1 && cont3-sum<70)players[i].is_T=true;if (cont3-sum >=70)players[i].is_pro=false;}int numb = pos3-cur;rak+=numb;cur+=numb;}printf("Player Name          Place     RD1  RD2  RD3  RD4  TOTAL     Money Won\n");printf("-----------------------------------------------------------------------\n");for (int i = 0; i < pos; ++i){printf("%-21s",players[i].name);int N=10;if (players[i].all_4<DQ){printf("%d",players[i].place);N-=rev_len(players[i].place);}if (players[i].is_T){printf("T");N--;}for (int i = 0; i < N; ++i)printf(" ");N=4;for (int j =0;j < 4; ++j){if(players[i].dq[j]!=DQ) printf("%-5d",players[i].dq[j]);else {N-=j;break;}}if (N==4)N=0;for(int i = 0; i < N; ++i)printf("     ");if (N){printf("DQ\n");continue;}if (players[i].is_pro){printf("%-10d",players[i].all_4);printf("$%9.2lf",players[i].money);}else printf("%d",players[i].all_4);printf("\n");}if (T)printf("\n");}}return 0;
}

例题5-10 UVA 207 PGA Tour Prize Money PGA巡回赛的奖金相关推荐

  1. 207:PGA Tour Prize Money

    PGA Tour Prize Money 这道题太麻烦了,先放这儿,日后再说... #include<cstdio> #include<cstring> #include< ...

  2. UVA 207 PGA Tour Prize Money

    题目链接:https://vjudge.net/problem/UVA-207 题目翻译摘自<算法禁赛入门经典> 题目大意 你的任务是为PGA(美国职业高尔夫球协会)巡回赛计算奖金.巡回赛 ...

  3. 例题5-10 PGA巡回赛的奖金(PGA Tour Prize Money,ACM/ICPC World Finals 1990 UVa207)

    原题链接:https://vjudge.net/problem/UVA-207 分类:耐力 备注:排序和其他细节处理 前言:这是我第二次默写刘老师的代码了,真的崩溃,错一点点细节都不行,对着uDebu ...

  4. UVa 207 - PGA Tour Prize Money

    时间限制:3.000秒 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&catego ...

  5. UVa 207 - PGA Tour Prize Money(模拟)

    分配PGA奖金的问题,题目不难,但是细节比较坑. 要注意数据的读入,排名带T的条件,奖金精度的控制等很多细节. #include<algorithm> #include<cstdio ...

  6. UVA - 207 PGA Tour Prize Money

    /*法一:代码借鉴修改自blog:http://blog.csdn.net/aozil_yang/article/details/50543965这个博客把思路和注意的地方说得很详细了,建议一看收获: ...

  7. PGA Tour PRize Money(Uva 207)

    //生无可恋,看的别人的代码,有时间理解,20ms <code class="hljs cpp has-numbering"><span class=" ...

  8. Uva207 PGA Tour Prize Money

    题目我就不放了,这是一道和师兄帮帮忙 同等恶心的难题... 首先udebug的数据是有问题的,不符合题目描述.当然我们可以修改写法使得udebug的数据能够过. 然后,udebug的数据不全,有几个重 ...

  9. 例题5-10 UVa207-PGA Tour Prize Money(WA)

    这道题真的是搞心态的神仙题了,由于到最后还是晕晕乎乎+WA,所以就不多说了,直接贴代码. 题目链接:UVa 207 WA代码: #include <iostream> #include & ...

最新文章

  1. Java项目:在线水果商城系统(java+JSP+Spring+SpringMVC +MyBatis+html+mysql)
  2. 标题:分数(2018C语言A组(1))
  3. 曾小伟:谁没被“不可思议”的薪资吸引过?
  4. vux radio 改造为 tree 代码片段
  5. Javascript开发技巧(JS中的变量、运算符、分支结构、循环结构)
  6. Pandas列小数转化为百分数
  7. 【网络安全工程师面试合集】—邮件协议是如何被安全人员利用的?
  8. 小扎展示Facebook十年产品路线图,跳票的智能音箱又有新爆料
  9. SQFREE - Square-free integers
  10. 如何在C#中从同步方法调用异步方法?
  11. 数独游戏技巧从入门到精通_免费教学视频数独阶梯训练让孩子从入门到精通,数学思维直线上升!...
  12. 突破同一账号不能同时在不同电脑登录限制程序软件(多电脑端登录器多开软件)
  13. 游戏是怎么赚钱的 - 聊聊山寨与混搭
  14. day02【Collection、泛型】
  15. phpwind 安装教程图文说明
  16. 更高效的记录方式,讯飞智能录音笔体验出色
  17. C++各行小数点对齐
  18. dw连接mysql数据库原理_Dreamweaver中连接SQL Server数据库代码
  19. linux网络配置ifconfig
  20. windows server2012无法安装IIS,提示:安装一个或多个角色、角色服务或功能失败

热门文章

  1. SCCB协议 verilog状态机定时器
  2. 串口、终端应用程序 API termios
  3. android+微信语音,android 仿微信按住语音说话(语音聊天)源码下载
  4. Java---鼠标事件小实例
  5. 超融合走向红海,下一代超融合是新蓝海?
  6. 微信小程序(小程序的生命周期)
  7. node.js和npm下载及安装详细教程
  8. 什么是promise,promise的用法。
  9. 磁盘柜支持linux,linux 连接磁盘柜
  10. TensorFlow TFRecords简介