HDU 1052(田忌赛马 贪心)
题意是田忌赛马的背景,双方各有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场的策略;
......
惊觉自己不断拆墙补墙的做法导致自己的策略不够完整,逻辑也不够严密,借鉴了别人的代码,才得出较为严密的策略:
以双方最慢的马比较,若田忌最慢的马比齐王最慢的马快,则本场用双方最慢的马比赛;若田忌最慢的马比齐王最慢的马慢,则本场用田忌最慢的马和齐王最快的马比赛;若两方最慢的马速度一样,则比较两方最快的马;若田忌最快的马快于齐王最快的马,本场用双方最快的马比赛,(若田忌最快的马和齐王最快的马一样快,暂不处理,保留;若田忌最快的马比齐王最快的马慢,则用田忌最慢的马去消耗齐王最快的马。)这里只比较田忌最慢的马和齐王最快的马即可。
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int cnt,n,pafast,pbfast,paslow,pbslow,ans,a[],b[];
while(~scanf("%d",&n)&&n)
{
for(int i = ; i < n; i++) scanf("%d",&a[i]);
for(int i = ; i < n; i++) scanf("%d",&b[i]);
sort(a,a+n);
sort(b,b+n);
pafast = pbfast = n-;
paslow = pbslow = ;
ans = cnt = ;
for(int i = ; i < n; i++)
{
if(a[paslow] > b[pbslow]) //当前田忌慢马快于齐王慢马
{
paslow++;
pbslow++;
ans++;
}
else if(a[paslow] < b[pbslow]) //当前田忌慢马慢于齐王慢马,选择与齐王快马比
{
paslow++;
pbfast--;
ans--;
}
else //当前田忌慢马与齐王慢马一样
{
if(a[pafast] > b[pbfast]) // 当前田忌快马快于齐王快马
{
pafast--;
pbfast--;
ans++;
}
else if(a[paslow] < b[pbfast]) // 当前田忌慢马慢于齐王快马,选择与齐王快马比
{
paslow++;
pbfast--;
ans--;
}
}
}
printf("%d\n",ans*);
}
return ;
}
个人觉得非常漂亮的分析:https://www.cnblogs.com/anderson0/archive/2011/05/07/2039971.html
(希望以后也能写出如此漂亮的分析...)
HDU 1052(田忌赛马 贪心)的更多相关文章
- hdu 1052 田忌赛马
贪心,排序从大到小.. 先比大的.跑只是就拿最小的来送死.. , 假设是平局就比后面的... 若后面也是平局就拿去跟前面的去跑. .. #include<stdio.h> #include ...
- HDU 1052 Tian Ji -- The Horse Racing (贪心)(转载有修改)
Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- HDU 1052
http://acm.hdu.edu.cn/showproblem.php?pid=1052 田忌赛马本质就是一个贪心 res表示田忌的胜利场次 1.田忌最快马快于王的最快马,两个最快马比,res++ ...
- Tian Ji -- The Horse Racing HDU - 1052
Tian Ji -- The Horse Racing HDU - 1052 (有平局的田忌赛马,田忌赢一次得200块,输一次输掉200块,平局不得钱不输钱,要使得田忌得到最多(如果只能输就输的最少) ...
- Hdu 4864(Task 贪心)(Java实现)
Hdu 4864(Task 贪心) 原题链接 题意:给定n台机器和m个任务,任务和机器都有工作时间值和工作等级值,一个机器只能执行一个任务,且执行任务的条件位机器的两个值都大于等于任务的值,每完成一个 ...
- D - 淡黄的长裙 HDU - 4221(贪心)
D - 淡黄的长裙 HDU - 4221(贪心) James is almost mad! Currently, he was assigned a lot of works to do, so ma ...
- HDU 1052 Tian Ji -- The Horse Racing(贪心)(2004 Asia Regional Shanghai)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1052 Problem Description Here is a famous story in Ch ...
- HDU 1052 贪心+dp
http://acm.hdu.edu.cn/showproblem.php?pid=1052 Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS ...
- HDU 1052 Tian Ji -- The Horse Racing(贪心)
题目来源:1052 题目分析:题目说的权值匹配算法,有点误导作用,这道题实际是用贪心来做的. 主要就是规则的设定: 1.田忌最慢的马比国王最慢的马快,就赢一场 2.如果田忌最慢的马比国王最慢的马慢,就 ...
随机推荐
- github 快速部署
在github上 新建一个项目后,并且未提交任何代码,会有一个页面提示我们如何快速部署.在此备份一下那个页面 Quick setup — if you’ve done this kind of thi ...
- 使用tree命令导出文件夹/文件的目录树
前提:己安装扩展: 介绍: TREE [drive:][path] [/F] [/A] /F 显示每个文件夹中文件的名称.(带扩展名) /A 使用 ASCII 字符,而不使用扩展字符. t ...
- DP及其优化
常见DP模型及其构造 序列DP ARC074 RGB Sequence 题意 给你一个长度为 \(n\) 的序列和 \(m\) 组约束条件,每组条件形如 \(l_i,r_i,x_i\),表示序列上的 ...
- RequestContextHolder 很方便的获取 request
在 Spring boot web 中我们可以通过 RequestContextHolder 很方便的获取 request. ServletRequestAttributes requestAttri ...
- Android应用开发资源
Android应用设计和开发人员现在可以参考由Android用户体验(UX)团队官方发布的Android设计指南.该指南提供了开发者应该遵循的基本原则,并列出了很多细节指导,涉及设备与显示.主题.触控 ...
- luogu3188/bzoj1190 梦幻岛宝珠 (分层背包dp)
他都告诉你能拆了 那就拆呗.把每个重量拆成$a*2^b$的形式 然后对于每个不同的b,先分开做30个背包 再设f[i][j]表示b<=i的物品中 容量为$ j*2^i+W\&((1< ...
- 【Linux】Linux系统硬链接和软链接
在linux系统中有种文件是链接文件,可以为解决文件的共享使用.链接的方式可以分为两种,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link). 查看lin ...
- CF1106E Lunar New Year and Red Envelopes
比赛时看到这题懵逼了,比完赛仔细一想是个很简单的dp = = 由于题目限制,可以发现\(B\)取红包的策略是唯一的,可以用优先队列预处理出\(B\)在第\(i\)秒可以拿到的红包的收益\(w_i\)和 ...
- 小电阻之大作用——CAN终端电阻
CAN总线终端电阻,顾名思义就是加在总线末端的电阻.此电阻虽小,但在CAN总线通信中却有十分重要的作用. 终端电阻的作用 CAN总线终端电阻的作用有两个: 1.提高抗干扰能力,确保总线快速进入隐性状态 ...
- Spring乱码问题解决方案
请求乱码 GET请求乱码: 原因:请求参数带在url地址上.url地址什么时候解析? tomcat收到请求对url进行编解码(ISO8859-1) 解决方案:在tomcat的8080端口配置出加上 U ...