田忌赛马 贪心 注意细节
http://poj.org/problem?id=2287
田忌赛马
题意:给田忌 和 国王 各自n匹马
比赛n轮 每匹马只能比一场 赢的一方得200 平得0
田忌最多赢多少
思路
贪心:局部最优------》》全局最优
先排序 大到小
然后ti ki 分别指向田忌 国王当前(即还没比)最大速度那匹马
tj kj 各自。。。。最小速度
1)田最快 > 国王最快 -----------田肯定赢
注意:是否拿田最快 打 国王最快 我当时认为最贪心应该看看后面还有没有也能 打过 国王最快的 有就拿那匹
分析:田 A B C D
国王 K F J
现在会不会存在一种情况 B能打过K 但不能打过F 而A能打过F? 如果存在那就证明我上面的猜想正确 不能直接用田最快 打 王最快
A >= B K>=F 如果B打过K 必然B就能打过F 所以不存在
所以答案应该 田最快 打 王最快
2)田最快 < 国王最快 -----------田肯定输
直接拿田当前最慢的 和 王最快的比
3)田最快 ==国王最快
3.1) 如果田最慢 > 王最慢 ----田赢
田最慢 打 王最慢
3.2) 如果田最慢 == 王最慢 ----田可能输 可能平
既然赢不了 那就用田最慢 耗掉 王的最快吧
输:田最慢 < 王最快
平:田最慢 == 王最快(可能当前只剩1匹 最快最慢都是一匹 那不就有可能相等了)
#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
#include<map>
#include<vector>
#include<set>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<functional>using namespace std;
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define LL long long
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
//#define mp make_pair
#define pb push_back
#define ULL unsigned LL
#define mem(a, b) memset(a, b, sizeof(a))
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
//#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);const int maxn = 1000 + 100;
int tian[maxn], king[maxn];
int cmp(int a, int b){return a > b;
}int main(){int n;while (~scanf("%d", &n) && n){for (int i = 1; i <= n; ++i) cin >> tian[i];for (int i = 1; i <= n; ++i) cin >> king[i];sort(tian + 1, tian + n + 1, cmp);sort(king + 1, king + n + 1, cmp);int ans = 0;int cnt = 0;int ti, tj, ki, kj;ti = ki = 1, tj = kj = n;while (/*ti <= tj*/cnt < n){cnt++;//田最快 > 王最快//田赢200if (tian[ti] > king[ki]){ans += 200;ti++, ki++;}//田最快 == 王最快else if (tian[ti] == king[ki]){//田最慢 > 王最慢//田赢200if (tian[tj] > king[kj]){ans += 200;tj--, kj--;}//田最慢 <= 王最慢 田慢 打 王快 //田肯定输else{//为什么是田最慢 < 王最快 if (tian[tj] < king[ki])ans -= 200;tj--, ki++;}田最慢 < 王最慢 田慢 打 王快 田输//else if (tian[tj] < king[kj]){// tj--,ki++;// ans -= 200;//}平局//else {// tj--,ki++;//}}//田快 < 王快 拿田慢 比 王快//田输else{tj--, ki++;ans -= 200;}}printf("%d\n", ans);}
}
田忌赛马 贪心 注意细节相关推荐
- 田忌赛马贪心算法_田忌赛马问题——贪心算法
关于输入 输入包含多组测试数据. 每组测试数据的第一行是一个整数n(1<=n<=1000),表示田忌和齐王都拥有n匹马.接下来一行是n个整数,表示田忌的马的速度,下一行也是n个整数,表示齐 ...
- 田忌赛马贪心算法_贪心算法--田忌赛马问题
题目描述: 你一定听过田忌赛马的故事吧? 如果3匹马变成1000匹,齐王仍然让他的马按从优到劣的顺序出赛,田忌可以按任意顺序选择他的赛马出赛.赢一局,田忌可以得到200两银子,输一局,田忌就要输掉20 ...
- 田忌赛马贪心算法_田忌赛马 贪心算法
算法实验课回顾 田忌赛马 问题描述: 你一定听说过田忌赛马的故事吧?如果3匹马变成n匹(n<=100),齐王仍然让他的马按照优到劣的顺序初赛,田忌可以按任意顺序选择他的赛马出赛.赢一局,田忌可以 ...
- 田忌赛马-贪心算法实现
田忌赛马c语言代码实现 1,问题描述 你一定听说过田忌赛马的故事吧?如果3匹马变成n匹(n<=100),齐王仍然让他的马按照优到劣的顺序初赛,田忌可以按任意顺序选择他的赛马出赛.赢一局,田忌可以 ...
- POJ2287 田忌赛马---贪心算法
田忌赛马 题目详见http://poj.org/problem?id=2287 田忌赛马大家都听过,可是如果不是上中下三等马,而是很多匹马,优劣有很多种分类,就不仅仅是321的问题了. 这个很明显就是 ...
- 洛谷P1650:田忌赛马 ← 贪心算法
[题目来源] https://www.luogu.com.cn/problem/P1650 [题目描述] 我国历史上有个著名的故事: 那是在2300年以前.齐国的大将军田忌喜欢赛马.他经常和齐王赛马. ...
- 田忌赛马贪心算法_贪心算法之田忌赛马
你一定听过田忌赛马的故事吧? 如果3匹马变成1000匹,齐王仍然让他的马按从优到劣的顺序出赛,田忌可以按任意顺序选择他的赛马出赛.赢一局,田忌可以得到200两银子,输一局,田忌就要输掉20 ...
- [ZJOI2008]泡泡堂(田忌赛马贪心)
problem 洛谷链接 solution 田忌赛马孪生兄弟. 浙江选手最坏情况就是外省最好情况,所以本质上两个子问题是同一个做法. 相信所有人都是读完题后就有田忌赛马的思想了.(如果还没上过小学语文 ...
- HDU1052 田忌赛马 贪心
一开始就知道是贪心,读入a[n],b[n],排序使数组降序排列,表示马从强到弱. 对于齐威王的每一匹马: 比得过就比 比不过就用我最弱的马跟对手最强的马比 如果马都是互异的,即a[n]中无重复数字,b ...
最新文章
- ROS发行版列表完整版
- 操作系统学习:Linux0.12初始化详细流程-进程退出与系统进入怠速
- python+selenium七:下拉框、选项框、select用法
- 利用python爬虫(案例7)--X讯招聘的小职位们
- 数据结构—链表-双链表
- leetcode hot 1-2
- oracle实现累加,oracle用sum函数实现累加
- [学习笔记] Cordova+AmazeUI+React 做个通讯录 - 联系人列表(2)
- 2015计算机软考试题及答案,2015年计算机软考网络工程师练习试题及答案
- 前端规范——前后端接口规范
- php 表格内边距,CSS 内边距
- ① 如何优雅快乐打出漂亮LaTeX数学公式——小乐数学zzllrr Mather公式编辑器教程
- 文科生学计算机能考研吗,求推荐文科生可以跨考计算机的名校
- 把VBA转换成JAVA_请教,我用Excel中生成了Java代码,用VBA生成Jav
- linux module load, show, 包管理,找到包的路径
- Redis基础(二)—— 基本命令与数据类型
- 桌面图标带有蓝色问号解决办法
- STM8L052C6 低功耗+LCD显示 经验分享
- 如何查看CentOS7的版本信息
- mysql打卡学习5常见函数