C/C++知识点之HDU 1052(田忌赛马)
小标 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
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved