一开始就知道是贪心,读入a[n],b[n],排序使数组降序排列,表示马从强到弱。
对于齐威王的每一匹马:

  • 比得过就比
  • 比不过就用我最弱的马跟对手最强的马比

如果马都是互异的,即a[n]中无重复数字,b[n]中无重复数字,那么上面的贪心是正确的。
怕就怕,a[n]和b[n]中包含很多重复的数字。

上面的贪心有一个问题,如果平了咋办?这就有一个原理:拒绝平局。
举个例子立马明白:
5 5 3 2
5 5 4 3
如果让前两局平局,那么后两局太吃亏了。不如前两局放弃,后两局还可一搏。所以:如果我最强马与对手最强马相等,则以我驽马应之。这样一来,我不赔(也赚不了):

  • 我驽马与对手最强马相等,说明我全部的马都一样,从最强到最弱速度都相等,怎么比都可以(不赔)。
  • 我驽马比对手最强马弱,则我的最强马以后可能会扳回一局,相当于和棋(不赔);如果我的最强马无法扳回一局,说明对手的马都相等,怎么比都可以(不赔)。
  • 我驽马比对手最强马强,这是不可能的,因为已经排序过了,连我最强马都是勉强平局,我最劣马定然不能胜。

一言以蔽之,上面这种法则能够将“一平一败”(-200)扭转为“一败一胜”(0)

于是得到新的贪心:

  • 能胜则比
  • 不能胜则以驽马应之

这样依然有问题,考虑下面情况:
田忌:3 3 2
威王:3 2 1
不能胜则以驽马应之,第一局我最劣马(2)应彼最强马(3),我败。我的最劣马(2)感到很委屈,它觉得自己明明可以跟威王最差的马(1)一较高下大胜一场。
所以得到最后的贪心:

  • 我最强马能胜敌最强马,干
  • 我最弱马能胜敌最弱马,干
  • 否则,不得已必败一场,以我最弱马战敌最强马
#include<iostream>
#include<stdio.h>
#include<list>
#include<queue>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 1007;
int a[maxn], b[maxn];
bool cmp(const int &x, const int&y){return y < x;
}
int main(){freopen("in.txt", "r", stdin); int n;while (cin >> n&&n){for (int i = 0; i < n; i++){cin >> a[i];}for (int i = 0; i < n; i++){cin >> b[i];}sort(a, a + n,cmp);sort(b, b + n,cmp);int ans = 0;int beg = 0,over=n-1;int from = 0, to = n - 1;for (int i = 0; i<n;i++){if (a[beg] > b[from]){beg++;from++;ans++;}else if (a[over] > b[to]){over--;to--;ans++;}else { if (a[over]<b[from])ans--;over--;from++;}}cout << ans * 200L << endl;}
}

转载于:https://www.cnblogs.com/weiyinfu/p/6552495.html

HDU1052 田忌赛马 贪心相关推荐

  1. 田忌赛马贪心算法_田忌赛马问题——贪心算法

    关于输入 输入包含多组测试数据. 每组测试数据的第一行是一个整数n(1<=n<=1000),表示田忌和齐王都拥有n匹马.接下来一行是n个整数,表示田忌的马的速度,下一行也是n个整数,表示齐 ...

  2. 田忌赛马贪心算法_贪心算法--田忌赛马问题

    题目描述: 你一定听过田忌赛马的故事吧? 如果3匹马变成1000匹,齐王仍然让他的马按从优到劣的顺序出赛,田忌可以按任意顺序选择他的赛马出赛.赢一局,田忌可以得到200两银子,输一局,田忌就要输掉20 ...

  3. 田忌赛马贪心算法_田忌赛马 贪心算法

    算法实验课回顾 田忌赛马 问题描述: 你一定听说过田忌赛马的故事吧?如果3匹马变成n匹(n<=100),齐王仍然让他的马按照优到劣的顺序初赛,田忌可以按任意顺序选择他的赛马出赛.赢一局,田忌可以 ...

  4. 田忌赛马-贪心算法实现

    田忌赛马c语言代码实现 1,问题描述 你一定听说过田忌赛马的故事吧?如果3匹马变成n匹(n<=100),齐王仍然让他的马按照优到劣的顺序初赛,田忌可以按任意顺序选择他的赛马出赛.赢一局,田忌可以 ...

  5. 田忌赛马 贪心 注意细节

    http://poj.org/problem?id=2287 田忌赛马 题意:给田忌 和 国王 各自n匹马 比赛n轮 每匹马只能比一场  赢的一方得200 平得0 田忌最多赢多少 思路 贪心:局部最优 ...

  6. POJ2287 田忌赛马---贪心算法

    田忌赛马 题目详见http://poj.org/problem?id=2287 田忌赛马大家都听过,可是如果不是上中下三等马,而是很多匹马,优劣有很多种分类,就不仅仅是321的问题了. 这个很明显就是 ...

  7. 洛谷P1650:田忌赛马 ← 贪心算法

    [题目来源] https://www.luogu.com.cn/problem/P1650 [题目描述] 我国历史上有个著名的故事: 那是在2300年以前.齐国的大将军田忌喜欢赛马.他经常和齐王赛马. ...

  8. 田忌赛马贪心算法_贪心算法之田忌赛马

    你一定听过田忌赛马的故事吧?       如果3匹马变成1000匹,齐王仍然让他的马按从优到劣的顺序出赛,田忌可以按任意顺序选择他的赛马出赛.赢一局,田忌可以得到200两银子,输一局,田忌就要输掉20 ...

  9. [ZJOI2008]泡泡堂(田忌赛马贪心)

    problem 洛谷链接 solution 田忌赛马孪生兄弟. 浙江选手最坏情况就是外省最好情况,所以本质上两个子问题是同一个做法. 相信所有人都是读完题后就有田忌赛马的思想了.(如果还没上过小学语文 ...

最新文章

  1. android 注册、登录实现程序
  2. shell scripts 之 代码量统计
  3. css div中文字位置_计算机二级Web(4):CSS基础 (上)
  4. 前端周记20190211-20190215
  5. JMeter如何和Charles进行接口测试
  6. 数据增强 | 小综述
  7. 封装判断一个字符的后缀名和前缀的方法
  8. python常用数学符号_数学菜鸟的AI学习攻略-AI学习常用数学符号 - 老牛博客
  9. 兼具教育耐心和AI匠心,看「网易有道词典笔2.0」的变革者角色
  10. [信道编码/Channel Coding】信道编码的整体框架
  11. 高通 msm8953 LCD 休眠/唤醒 流程
  12. Flash builder 网络监视器的使用感想
  13. Java SE java基础 求营业额
  14. 百度收集子域名(2021.9.9)
  15. 努比亚android最高版本,努比亚Z11安卓7.1固件开发版下载地址:新增压力按键等功能...
  16. “SCSA-S学习导图+”系列:文件包含
  17. 基于OpenXR,Collabora推开源VI-SLAM AR/VR定位系统
  18. python 绘制箱型图
  19. 量化投资入门指南:风险模型和交易成本模型
  20. mysql死锁的原因及解决方法_mysql死锁的原因及解决方法

热门文章

  1. 一文了解H5照片上传过程
  2. Taotao Picks Apples
  3. Android 软键盘弹出,界面整体上移的问题
  4. 【Java NIO的深入研究5】字符集Charset
  5. 九度OJ 1048:判断三角形类型
  6. WMPLib.WindowsMediaPlayer 的用法
  7. 【实习之T100开发】T100 双档程序开发流程
  8. windows域策略——配置组策略刷新间隔
  9. [转]Git:如何在项目提交历史中查找已删除的文件?
  10. mongodb空间查询java,java查看mongodb集合表空间大小