贪心难题;总结贪心问题的一般思路

传送门:$>here<$

题意

田忌和齐王各有n匹马,赛马时一一对应。赢+200,输-200,平+0. 问最多多少钱?

数据范围:$n \leq 2000$

Solution

如果没有平局

将齐王和田忌的马都按照速度从大到小排序。然后同时从两方最大的开始考虑。

设齐王当前最大的马为x,最小的为y;田忌最大的为a,最小的为b;

若x>a,说明x大于任何田忌的马。此时应当使用b去碰x。证明:如果不使用b,而使用比b更大的马,设为c,去碰x能达到最优解。用c也输,用b也输,用b去反而留出更大的c去赢别的。故使用b也可以达到最优解。

若x<a,此时应当让a去赢x。证明:如果不使用a,而使用比a更小的马去碰x能达到最优解。那么a肯定碰了个更弱的。若交换必定不会造成损失。故使用a也可以达到最优解。

决定了这一步,之后就是子问题了。一个模子去解决即可。

有平局

和刚才一样,只不过多了一类情况。

若x=a,那么暂且不能决定——这是一个僵局。我们希望摆脱这一局面,转化为刚才的形式。去寻找看还有什么能一步决定。

1. y>b,说明b死定了。要死就与齐王最强的同归于尽,证明雷同。

2. y<b,应当让b去赢。证明同x<a的情况。

1能够改变x=a的现状,继续做子问题即可。2的话就继续判断尾巴。

关键问题来了——

3. y=b

此时头相等,尾相等。相当棘手。

我们应当选择令b去碰x。证明:如果b不碰x也能达到最优解。那么意味着

1. 两头都去碰平。那么如果使两头交叉,不会有所损失。

2. 一头碰平。以b碰y为例。设d遇到x,那么d的一定输。(-200)那么交换,使x碰b,d碰y(+0)。故没有损失

3. 两头都不碰平。x碰b更优。

透过题解看本质

贪心问题的一般思路

1. 通过小数据发现规律,猜出贪心策略。

2. 验证最优子结构性质(即能否DP)

贪心可以看做DP的一种特殊情况,只不过每一步不需要考虑所有可能情况,而是直接选择最优的。

3. 验证贪心选择性。一般使用反证法。

有点像数学归纳法。即证出该策略能够达到最优解。设...能达到最优解,改用该策略不会有损失,故能达到最优解。

在第一步能够用这种方法达到最优解,然后解子问题。子问题中第一步能达到子问题最优解,然后解子问题的子问题……故最终得到最优解。

利用常识

这道题中,利用了田忌赛马的常识帮助我们寻找策略。“赢多少不重要,只要赢就好”这一思想使我们想到了赢的不浪费。

子问题

在贪心里,利用子问题去思考依然很重要。

my code

注意x碰b的时候要考虑平局。

/*By DennyQi 2018*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAXN = ;
const int MAXM = ;
const int INF = 0x3f3f3f3f;
inline int Max(const int a, const int b){ return (a > b) ? a : b; }
inline int Min(const int a, const int b){ return (a < b) ? a : b; }
inline int read(){
int x = ; int w = ; register char c = getchar();
for(; c ^ '-' && (c < '' || c > ''); c = getchar());
if(c == '-') w = -, c = getchar();
for(; c >= '' && c <= ''; c = getchar()) x = (x<<) + (x<<) + c - ''; return x * w;
}
int n,a[],b[];
int Win(int h1, int t1, int h2, int t2){
if(h1 == t1){
if(a[h1] == b[h2]) return ;
if(a[h1] > b[h2]) return ;
if(a[h1] < b[h2]) return -;
}
if(a[t1] > b[t2]) return Win(h1,t1-,h2,t2-)+;
if(a[t1] < b[t2]) return Win(h1+,t1,h2,t2-)-;
if(a[h1] > b[h2]) return Win(h1+,t1,h2+,t2)+;
if(a[h1] < b[h2]) return Win(h1+,t1,h2,t2-)-;
return Win(h1+,t1,h2,t2-)-*(a[h1]!=b[t2]);
}
int main(){
n = read();
for(int i = ; i <= n; ++i) a[i] = read();
for(int i = ; i <= n; ++i) b[i] = read();
sort(a+,a+n+);
sort(b+,b+n+);
printf("%d", Win(,n,,n));
return ;
}

[洛谷P1650] 田忌赛马的更多相关文章

  1. 洛谷P1650赛马与codevs 2181 田忌赛马

    洛谷P1650 赛马 题目描述 我国历史上有个著名的故事: 那是在2300年以前.齐国的大将军田忌喜欢赛马.他经常和齐王赛马.他和齐王都有三匹马:常规马,上级马,超级马.一共赛三局,每局的胜者可以从负 ...

  2. 洛谷P1650 赛马[2017年5月计划 清北学堂51精英班Day1]

    P1650 赛马 题目描述 我国历史上有个著名的故事: 那是在2300年以前.齐国的大将军田忌喜欢赛马.他经常和齐王赛马.他和齐王都有三匹马:常规马,上级马,超级马.一共赛三局,每局的胜者可以从负者这 ...

  3. 洛谷 P2587 BZOJ 1034 [ZJOI2008]泡泡堂

    题目描述 //不知道为什么BZOJ和洛谷都没有这幅图了,大牛们几年前的博客上都有这幅图的,把它贴上来吧 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省 ...

  4. 【贪心】洛谷2019 OI春令营 - 普及组 作业

    [P3817 小A的糖果 小A有N个糖果盒,第i个盒中有a[i]颗糖果. 小A每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中加起来都只有x颗或以下的糖果,至少得吃掉几颗糖. [贪 ...

  5. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  6. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  7. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  8. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  9. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

随机推荐

  1. 告别 hash 路由,迎接 history 路由

    博客地址:https://ainyi.com/69 三月来了,春天还会远吗.. 在这里,隆重宣布本博客告别 Vue 传统的 hash 路由,迎接好看而优雅的 history 路由~~ 映照官方说法 v ...

  2. 用bat批处理程序通过DOS命令行删除所有的空文件夹

    用过gothub或者码云的同学都知道,不包含任何文件的空文件夹上传提交时不被允许的.当然你可以在空文件下创建.keep文件(或.gitkeep文件),然后就可以上传了. 但是如果空文件夹比较多,并且我 ...

  3. Spring MVC的文件上传和下载

    简介: Spring MVC为文件上传提供了直接的支持,这种支持使用即插即用的MultipartResolver实现的.Spring MVC 使用Apache Commons FileUpload技术 ...

  4. springMVC实现增删改查

    首先需要准备好一张数据库表我这里用emp这张表:具体代码: /* SQLyog 企业版 - MySQL GUI v8.14 MySQL - 5.1.73-community ************* ...

  5. IDEA 安装配置可视化 MongDB 插件

    IDEA 安装配置可视化 MongDB 插件 1.安装MongoDB插件 打开 IDEA ,file --> settings --> plugins,在右边搜索栏中输入Mongo,点击 ...

  6. Doctype的作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义?

    Doctype作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义? 1.1 Doctype作用 <!DOCTYPE>声明叫做文件类型定义(DTD),声明的作用为了告诉浏览器该 ...

  7. nlp中文分词(jieba和pyltp)

    分词是中文自然语言处理的基础.目前常用的分词算法有 1.张华平博士的NShort中文分词算法. 2.基于条件随机场(CRF)的中文分词算法. 这两种算法的代表工具包分别是jieba分词系统和哈工大的L ...

  8. python docx文档转html页面

    文章链接:https://mp.weixin.qq.com/s/uMb2ziRS1NJ1GXIjofeANg 说到word文档转html的,网上一搜一大把,各种在线word转html页面,使用起来也方 ...

  9. 巧用Handler获取View控件信息

    众所周知,在Android实际开发中,对于某些复杂多变的情况,控件的位置摆放.大小控制并非是xml类型的layout文件完全可以搞定的.此时,我们通常会使用Java代码来通过动态计算,将指定的控件摆放 ...

  10. Ubuntu 服务器443端口证书配置

    配置虚拟主机: cd /etc/apache2/sites-available 从默认的模板文件中复制过来一份进行自己的配置: sudo cp ./default-ssl.conf ./mysite1 ...