题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1052

错误代码:

#include<stdio.h>//田忌赛马,错误版
#include<string.h>
#include<stdlib.h>
/*思路:用田忌最快的马与齐王最快的马比较,1.若能赢就赢;2.若赢不了,就用最差的马拖齐王最好的马入水;3.若打平:要判断是否在最好一匹马,
若是,则打平,若不是,则用最差的一匹马拖它下水,虽然输了这次,但下次有机会赢回。看似无差别,但这样做却保留了最多的好马。
然而这种思靠虽然完备,但方向一开始已经错了。为什么田忌自己赛会输,因为他用最好的马与最好的马去比,硬碰硬。然而孙膑的想法是
避其锋芒,攻其弱点,也就是说,要赢比赛,就要尽量在齐王的弱马上赢,因为这样成本低,收益更大。而不是在齐王的强马上赢得比赛。
所以比赛从齐王最弱的马开始kill。
int cmp(const void*a, const void*b)
{
return *(int*)b - *(int*)a;
} int main()
{
int n,i,j,m,t[1010],k[1010];
while(scanf("%d",&n) && n)
{
for(i = 0; i<n; i++) scanf("%d",&t[i]);
for(i = 0; i<n; i++) scanf("%d",&k[i]);
qsort(t,n,sizeof(t[0]),cmp);
qsort(k,n,sizeof(k[0]),cmp); m = 0;
int th = 0,tt = n-1,kh = 0;
while(kh<n)
{
if(t[th]>k[kh]) {th++;kh++;m++;}
else if(t[th]<k[kh]) {tt--;kh++;m--;}
else
{
if(kh==n-1) {th++; kh++;}
else {tt--; kh++; m--;}
}
} printf("%d\n", m*200);
}
return 0;
}

正确代码:

#include<stdio.h>//正确方案,从弱马开始
#include<string.h>
#include<stdlib.h> int cmp(const void*a, const void*b)
{
return *(int*)b - *(int*)a;
} int main()
{
int n,i,j,m,t[1010],k[1010];
while(scanf("%d",&n) && n)
{
for(i = 0; i<n; i++) scanf("%d",&t[i]);
for(i = 0; i<n; i++) scanf("%d",&k[i]);
qsort(t,n,sizeof(t[0]),cmp);
qsort(k,n,sizeof(k[0]),cmp); m = 0;
int th = 0,tt = n-1,kh = 0,kt = n-1;
while(th<=tt)
{
if(t[tt]>k[kt])//田弱能赢齐弱,则赢
{tt--; kt--; m++;}
else if(t[tt]<k[kt])//田弱输齐弱,反正都要死,这匹弱马就要死得最有价值,用它去拖齐强下水
{tt--;kh++; m--;}
else
{
/*田弱平齐弱,总体来说,这匹田弱拿去拖齐强下水,那么田忌获胜的机会更大些,但有例外,
就是万一这匹弱马死得不值呢:田强本来就可以赢齐强,还何必用田弱拖它下水,况且齐弱本可以平局,
这样搞就反而输掉了一局*/
if(t[th]>k[kh])//所以这里要判断田强是否赢齐强,看看田弱是否死得有价值
{th++; kh++; m++;}//死得没价值,这局就让田强赢齐强
else if(t[th]<k[kh])//死得有价值,上吧,田忌会记住你的
{tt--; kh++; m--;} else //田强平齐强,为了保存实力,也让齐弱上(但田弱不一定输)。
{
if(t[tt]<k[kh]) m--;//田弱可能平田强,当田强平齐强时,要判断田弱是否真的弱于田强,可能打平
tt--; kh++;
}
}
}
printf("%d\n", m*200);
}
return 0;
}

hdu1052 田忌赛马 —— 贪心的更多相关文章

  1. hdu1052(田忌赛马 贪心)

    好坑的一道题,不过确实是贪心的一道好题,想了好久一直无法解决平局的情况.  参考了别人的思路,然后结合了自己的想法,总算是想出来了. 这题有些步骤是必须要执行的,有四个步骤 一.当期状态田忌的最慢的马 ...

  2. HDU-1052(贪心策略)

    Tian Ji -- The Horse Racing Problem Description Here is a famous story in Chinese history. "Tha ...

  3. POJ 2287 田忌赛马 贪心算法

    田忌赛马,大致题意是田忌和国王赛马,赢一局得200元,输一局输掉200元,平局则财产不动. 先输入一个整数N,接下来一行是田忌的N匹马,下一行是国王的N匹马.当N为0时结束. 此题为贪心算法解答,有两 ...

  4. HDU 1052(田忌赛马 贪心)

    题意是田忌赛马的背景,双方各有n匹马,下面两行分别是田忌和齐王每匹马的速度,要求输出田忌最大的净胜场数*每场的赌金200. 开始的时候想对双方的马匹速度排序,然后比较最快的马,能胜则胜,否则用最慢的马 ...

  5. [POJ2287][Tyvj1048]田忌赛马 (贪心+DP)

    瞎扯 很经典的一道题 考前才打 我太菜了QAQ 就是先贪心排序了好 然后在DP 这样比直接DP更容易理解 (其实这题做法还有很多) 代码 #include<cstdio> #include ...

  6. hdu-1052(贪心)

    链接 [https://vjudge.net/contest/261555#problem/I] 题意 就是两个人都有n匹马,每只马都有战力 第二个人出马的顺序是战力大到小,请问第一个人采取怎样的策略 ...

  7. luogu P1650 田忌赛马 |贪心

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

  8. 【集训笔记】贪心算法【HDOJ1052 【HDOJ2037

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  9. 【贪心】[hdu1052]Tian Ji -- The Horse Racing(田忌赛马)[c++]

    Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...

随机推荐

  1. git移除上一次的commit中误添加的文件

    在使用git进行版本管理时,往往会出现一些误操作,比如将一些不加上传的文件放到了暂存区,即上传到了上一次commit中 比如: commit c134ab90ca7c4daf8bfa22e3ad706 ...

  2. java webservice wsimport 无法将名称 'soapenc:Array' 解析为 'type definition' 组件 时对应的解决方法

    (一):代码如下: package com.enso.uploaddata; import org.apache.axis.client.Call; import org.apache.axis.cl ...

  3. Zab算法详解

    Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况:高吞吐量 ...

  4. JVM加载的初始化类

    首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默 ...

  5. Chrom查看Flash缓存文件及Flash下载方法

    比如在优酷看视频时,或者熊猫直播,如果使用Flash进行播放的基本都会先缓存在本地,只不过这个缓存的名字后缀不叫flv,而是类似tmp这样:通常只要找到这个缓存文件,然后改为flv即可播放:如果出现文 ...

  6. xamarin android 获取根证书代码

    Java.Security.KeyStore keyStore = Java.Security.KeyStore.GetInstance("AndroidCAStore"); ke ...

  7. oralce中相关的概念整理

    [数据库名]  概念:就是一个数据库的标识,作用等同于我们的身份证的作用,假设一台机器上安装了多个数据库,那么每一个数据库都会有一个数据库名称相应,这些数据库名称在数据库被创建的时候,数据库名称也会被 ...

  8. vue 给组件绑定原生事件

    有时候,你可能想在某个组件的根元素上监听一个原生事件.可以使用 v-on 的修饰符 .native.例如: <my-component v-on:click.native="doThe ...

  9. hadoop集群搭建datenode为0问题的解决

       搭建了一个小的实验集群,一共4台机器,一台namenode,三台datenode.运行start-all,发如今namenode上没有报不论什么错误,可是启动后直接显示datenode数量为0. ...

  10. 如何去掉Google搜索的跳转 让你的Google搜索不被reset掉

    http://www.nowamagic.net/librarys/veda/detail/389 在点击google搜索结果时,google会在结果的URL前做个跳转,且有时这个跳转地址会被墙,这样 ...