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;
}

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com