hdu1052(田忌赛马 贪心)

好坑的一道题,不过确实是贪心的一道好题,想了好久一直无法解决平局的情况。  参考了别人的思路,然后结合了自己的想法,总算是想出来了。

这题有些步骤是必须要执行的,有四个步骤

一、当期状态田忌的最慢的马比对手最慢的马快,那么就直接比赢了这一盘,因为对手最慢的马比田忌所有马都慢,田忌为了后面的情况最优就用最小的代价来赢得这一个必胜的局。 二、当前状态田忌最慢的马比对手最慢的马慢,说明田忌最慢的马比对手所有的马慢,对于这个必败的情况田忌自然会用这匹马去耗对手最快的马,所以这局用最慢的马去和对手最快的马比。

三、同理,当前状态田忌最快的马比对手最快的马快,则比这盘

四、同理,当前状态田忌最快的马比对手最快的马慢,则用田忌最慢的马来耗队友最快的马。 因为对手最快的马怎么都要赢,所以要尽量减少损失。

也就是只要出现了这四种情况的其中一种,则必按上述步骤执行。但是还有一种情况,那就上述四种情况突然出现了两种,那么到底先执行哪一种呢? 仔细想下就可以发现,先执行那一种情况最后的结果是相同的。

最后还可能会出现一种死局,那就是两头都相等的时候,这时候你可以假设一下用田忌最慢的马去和对手最快的马比,会出现两种情况,一种是对手最快的马比田忌最慢的马快,但是田忌最快的马也比对手最慢的马快, 所以最坏情况田忌也可以使得除去最快最慢的马剩下来的马,与对手除去最快和最慢剩余下来的马,继续比较,这与两边都比成平局或者一边平局所到达情况相同。 第二种,是当前状态所有的马速度相同,这样任何一种策略得出的结果都是相同的。

按照这种思路,这题就可以解了。

hdu1052

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <string>
#include <queue>
#include <stdlib.h>
using namespace std;
#define N 1100

int ga[N],gt[N];

int main()
{
    int n;
    while(scanf("%d",&n)&&n)
    {
        for(int i=0;i<n;i++)
            scanf("%d",gt+i);
        for(int i=0;i<n;i++)
            scanf("%d",ga+i);
        sort(ga,ga+n);
        sort(gt,gt+n);
        int ans=0;
        int ab,ad,tb,td;
        ab=0,ad=n-1; tb=0,td=n-1;
        int sign=0;
        while(1)
        {
            if(sign==0)
            {
                if(gt[tb]>ga[ab])
                {
                    ans++;
                    tb++; ab++;
                    if(tb>td) break;
                }
                else if(gt[tb]<ga[ab])
                {
                    if(ga[ad]>gt[tb]) ans--;
                    tb++; ad--;
                    if(tb>td) break;
                }
                else
                {
                    if(ga[ad]==gt[td])
                    {
                        if(ga[ad]>gt[tb]) ans--;
                        tb++;ad--;
                        if(tb>td) break;
                    }
                    else
                    {
                        sign=1; //否者交换方式
                    }
                }
            }
            else
            {
                if(gt[td]>ga[ad])
                {
                    ans++;
                    td--;ad--;
                    if(tb>td) break;
                }
                else if(gt[td]<ga[ad])
                {
                    ans--;
                    tb++; ad--;
                    if(tb>td) break;
                }
                else
                {
                    if(ga[ab]==gt[tb])
                    {
                        if(ga[ad]>gt[tb]) ans--;
                        tb++; ad--;
                        if(tb>td) break;
                    }
                    else
                    {
                        sign=0;
                    }
                }
            }
        }
        printf("%d\n",ans*200);
    }
    return 0;
}
时间: 2024-10-27 19:37:28

hdu1052(田忌赛马 贪心)的相关文章

hdu 1052(田忌赛马 贪心算法,sort排序)

Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18155    Accepted Submission(s): 5281 Problem Description Here is a famous story in Chinese history. "That was about

[BZOJ 1034][ZJOI2008]泡泡堂BNB(类田忌赛马贪心)

http://www.lydsy.com:808/JudgeOnline/problem.php?id=1034 我会说这就是改版POJ的那道Tianji the horse racing么... 不过这个题的游戏规则略有些不同,赢了得2分,平了得1分,输了不扣分,所以贪心过程和POJ的那题略有一点不同,具体看代码吧. #include <iostream> #include <stdio.h> #include <stdlib.h> #include <stri

[Poj2287][Tyvj1048]田忌赛马 (贪心+DP)

瞎扯 很经典的一道题 考前才打 我太菜了QAQ 就是先贪心排序了好 然后在DP 这样比直接DP更容易理解 (其实这题做法还有很多) 代码 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define N 1005 5 using namespace std; 6 int n,money,t[N],q[N]; 7 int f[N][N]; 8 bool cmp(int a,int b) 9 {

hdu-1052(贪心)

链接 [https://vjudge.net/contest/261555#problem/I] 题意 就是两个人都有n匹马,每只马都有战力 第二个人出马的顺序是战力大到小,请问第一个人采取怎样的策略使得自己总的胜场尽可能多 分析 肯定先对二者的战力分别排序 然后就是想尽可能地把第一个人的每只马发挥最大的作用 如果该马不能打败对方的任何一只马就让它尽可能地把对方最强战力的马,搞定 虽然输了但后面也会有更大的可能多赢 所以就从战力最弱的马相比较 如果当前的我最弱的马大于对方最弱的马就直接比掉 得一

C语言贪心(2)___田忌赛马(Hdu 1052)

Problem Description Here is a famous story in Chinese history. "That was about 2300 years ago. General Tian Ji was a high official in the country Qi. He likes to play horse racing with the king and others." "Both of Tian and the king have t

HDU1052 Tian Ji -- The Horse Racing 贪心

Tian Ji -- The Horse Racing Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1052 Description Here is a famous story in Chinese history. "That was about 2300 years ago. General Tian Ji was a

HDU ACM 1052 Tian Ji -- The Horse Racing 贪心

#include<iostream> #include<algorithm> using namespace std; int main() //贪心 { int n,money,i,j,i1,j1; int a[1005],b[1005]; while(cin>>n && n) { for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<n;i++) cin>>b[i]; sort(a,a+n);

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

HDU-1052 Tian Ji -- The Horse Racing 贪心 考虑特殊位置(首尾元素)的讨论

题目链接:https://cn.vjudge.net/problem/HDU-1052 题意 田忌赛马问题扩展版 给n匹马,马的能力可以相同 问得分最大多少 思路 贪心做得还是太少,一开始一点思虑都没有的 这里稍微总结一下如何打开思路吧 从特殊位置开始考虑是否存在某种必然性,包括不限于序列首尾 若讨论难以进行,试着把这个讨论点展开,换个角度(或者换个特殊位置)讨论 首先排序 其次的关键是讨论尾元素是否必胜或必败,思考贪心 在一个关键是双方尾元素相同时,展开考虑首元素是否必胜或必败,思考贪心 当首