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.如果田忌最慢的马比国王最慢的马慢,就 ...
随机推荐
- EtherType :以太网类型字段及值
Ethernet II即DIX 2.0:Xerox与DEC.Intel在1982年制定的以太网标准帧格式.Cisco名称为:ARPA Ethernet II类型以太网帧的最小长度为64字节(6+6+2 ...
- BZOJ5093图的价值(斯特林数)
题目描述 “简单无向图”是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向图的价值之和. 因为答案很大,请对 ...
- urls 管理
问题阐述:如何管理多个app下的路由分发,使得管理更加清晰? 1. 在app下创建urls.py文件 from django.conf.urls import url from django.urls ...
- Codeforces Round #516 (Div. 2)D. Labyrinth(BFS)
题目链接:http://codeforces.com/contest/1064/problem/D 题目大意:给你一个n*m的图,图中包含两种符号,'.'表示可以行走,'*'表示障碍物不能行走,规定最 ...
- List双向链表容器
list 容器实现了双向链表的数据结构,数据元素是通过链表指针串连成逻辑意义上的线 性表,这样,对链表的任一位置的元素进行插入.删除和查找都是极快速的. 图 2-7 是 list 采用的双向循环链表的 ...
- 安装Ubuntu Server18.04(附与CentOS占用体积和Python版本的对比)
这边只演示一下最新系统的安装过程,设置之类的和以前讲的Kali以及CentOS大同小异:https://www.cnblogs.com/dunitian/p/4822808.html#linux 和C ...
- react-redux单元测试(基于react-addons-test-utils,mocha)
今天补上上次新闻客户端欠下的单元测试.新闻客户端github地址:点我,接上篇博客. 本次单元测试用到了单元测试比较流行的测试框架mocha,用到的是expect断言库,和react官方的测试插件:r ...
- Linux中编译或安装程序时提示No such file or directory
deb系发行版本 Debian Ubuntu Linux Mint等 dpkg -S dpkg-query -S rpm系发行版本 RHEL CentOS等 yum provides rpm -qf ...
- GNOME下让QT应用使用adwaita主题统一外观
效果展示 使用前 使用后 步骤 Arch Linux下使用AUR安装 sudo yaourt adwaita-qt4 adwaita-qt5 sudo pacman -S qtconfig-qt4 q ...
- tyvj/joyoi 1336 火车进栈
比原题水了很多(因为原题要高精度) 输出字典序前20种出栈序列. 其实是贪心题:我们每次确定一个出栈的数. 当栈里有数时,字典序显然比从后面拿数要小,所以先搜这个. 之后依次搜后面队列里的数,因为字典 ...