小标
2018-08-10
来源 :
阅读 2155
评论 0
摘要:本文主要向大家介绍了C/C++知识点之HDU 1052(田忌赛马),通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
本文主要向大家介绍了C/C++知识点之HDU 1052(田忌赛马),通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
题意是田忌赛马的背景,双方各有n匹马,下面两行分别是田忌和齐王每匹马的速度,要求输出田忌最大的净胜场数*每场的赌金200。
开始的时候想对双方的马匹速度排序,然后比较最快的马,能胜则胜,否则用最慢的马去消耗对方,但这样存在问题:1 2 3 对 1 3 3的时候,会变成1 - 3,2 - 3,3 - 1,净胜-1场,而实际存在1 - 3,2 - 1,3 - 3的净胜0场的策略;
然后自然想到的是要对平局进行特殊处理,当双方最快的马能战平时,比较最慢马,如果最慢马能胜对方,就用最慢马胜对方,然后让两方最快马战平,但是:2 3 5 对 1 4 5的时候,会变成 2 - 1,3 - 4,5 - 5,净胜0场,而实际存在2 - 1,3 - 5,5 - 4的净胜1场的策略;
......
惊觉自己不断拆墙补墙的做法导致自己的策略不够完整,逻辑也不够严密,借鉴了别人的代码,才得出较为严密的策略:
以双方最慢的马比较,若田忌最慢的马比齐王最慢的马快,则本场用双方最慢的马比赛;若田忌最慢的马比齐王最慢的马慢,则本场用田忌最慢的马和齐王最快的马比赛;若两方最慢的马速度一样,则比较两方最快的马;若田忌最快的马快于齐王最快的马,本场用双方最快的马比赛,(若田忌最快的马和齐王最快的马一样快,暂不处理,保留;若田忌最快的马比齐王最快的马慢,则用田忌最慢的马去消耗齐王最快的马。)这里只比较田忌最慢的马和齐王最快的马即可。
1 #include
2 #include
3 using namespace std;
4 int main()
5 {
6 int cnt,n,pafast,pbfast,paslow,pbslow,ans,a[1009],b[1009];
7 while(~scanf("%d",&n)&&n)
8 {
9 for(int i = 0; i < n; i++) scanf("%d",&a[i]);
10 for(int i = 0; i < n; i++) scanf("%d",&b[i]);
11 sort(a,a+n);
12 sort(b,b+n);
13 pafast = pbfast = n-1;
14 paslow = pbslow = 0;
15 ans = cnt = 0;
16 for(int i = 0; i < n; i++)
17 {
18 if(a[paslow] > b[pbslow]) //当前田忌慢马快于齐王慢马
19 {
20 paslow++;
21 pbslow++;
22 ans++;
23 }
24 else if(a[paslow] < b[pbslow]) //当前田忌慢马慢于齐王慢马,选择与齐王快马比
25 {
26 paslow++;
27 pbfast--;
28 ans--;
29 }
30 else //当前田忌慢马与齐王慢马一样
31 {
32 if(a[pafast] > b[pbfast]) // 当前田忌快马快于齐王快马
33 {
34 pafast--;
35 pbfast--;
36 ans++;
37 }
38 else if(a[paslow] < b[pbfast]) // 当前田忌慢马慢于齐王快马,选择与齐王快马比
39 {
40 paslow++;
41 pbfast--;
42 ans--;
43 }
44 }
45 }
46 printf("%d\n",ans*200);
47 }
48 return 0;
49 }
View Code
个人觉得非常漂亮的分析:https://www.cnblogs.com/anderson0/archive/2011/05/07/2039971.html
(希望以后也能写出如此漂亮的分析...)
日后若能完善开始时的想法,再来补充。
本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号