三國遊戲

個人blog:傳送門
html

題目描述spa

小涵很喜歡電腦遊戲,這些天他正在玩一個叫作《三國》的遊戲。設計

在遊戲中,小涵和計算機各執一方,組建各自的軍隊進行對戰。遊戲中共有 NN 位武將(NN爲偶數且不小於44),任意兩個武將之間有一個「默契值」,表示若此兩位武將做爲一對組合做戰時,該組合的威力有多大。遊戲開始前,全部武將都是自由的(稱爲自由武將,一旦某個自由武將被選中做爲某方軍隊的一員,那麼他就再也不是自由武將了),換句話說,所謂的自由武將不屬於任何一方。code

遊戲開始,小涵和計算機要從自由武將中挑選武將組成本身的軍隊,規則以下:小涵先從自由武將中選出一個加入本身的軍隊,而後計算機也從自由武將中選出一個加入計算機方的軍隊。接下來一直按照「小涵→計算機→小涵→……」的順序選擇武將,直到全部的武將被雙方均分完。而後,程序自動從雙方軍隊中各挑出一對默契值最高的武將組合表明本身的軍隊進行二對二比武,擁有更高默契值的一對武將組合獲勝,表示兩軍交戰,擁有獲勝武將組合的一方獲勝。orm

已知計算機一方選擇武將的原則是儘可能破壞對手下一步將造成的最強組合,它採起的具體策略以下:任什麼時候刻,輪到計算機挑選時,它會嘗試將對手軍隊中的每一個武將與當前每一個自由武將進行一一配對,找出全部配對中默契值最高的那對武將組合,並將該組合中的自由武將選入本身的軍隊。 下面舉例說明計算機的選將策略,例如,遊戲中一共有66個武將,他們相互之間的默契值以下表所示:htm

雙方選將過程以下所示:blog

小涵想知道,若是計算機在一局遊戲中始終堅持上面這個策略,那麼本身有沒有可能必勝?若是有,在全部可能的勝利結局中,本身那對用於比武的武將組合的默契值最大是多少?遊戲

假設整個遊戲過程當中,對戰雙方任什麼時候候均能看到自由武將隊中的武將和對方軍隊的武將。爲了簡化問題,保證對於不一樣的武將組合,其默契值均不相同。get

輸入格式input

共 N 行。

第一行爲一個偶數 NN,表示武將的個數。

第 22行到第 NN行裏,第i+1i+1行有N_iNi個非負整數,每兩個數之間用一個空格隔開,表示ii號武將和i+1,i+2,…,Ni+1,i+2,,N號武將之間的默契值(0≤0≤默契值≤1,000,000,0001,000,000,000)。

輸出格式

共 11 或 22行。

若對於給定的遊戲輸入,存在可讓小涵獲勝的選將順序,則輸出11,並另起一行輸出全部獲勝的狀況中,小涵最終選出的武將組合的最大默契值。若是不存在可讓小涵獲勝的選將順序,則輸出 00。

輸入輸出樣例

輸入 #1
6 
5 28 16 29 27 
23 3 20 1 
8 32 26 
33 11 
12 
輸出 #1
1
32

輸入 #2

8 
42 24 10 29 27 12 58 
31 8 16 26 80 6 
25 3 36 11 5 
33 20 17 13 
15 77 9 
4 50 
19 

輸出 #2

1 77

說明/提示

【數據範圍】

對於40\%40%的數據有 N≤10N10。

對於70\%70%的數據有N≤18N18。

對於 100\%100%的數據有 N≤500N500。

這個題儘管題目長,主要仍是證實貪心的正確性。

首先注意到,在這個題裏,計算機是貪心的,也就是說,不管人選什麼,它都會盡量去選與人默契值最大的。想到這裏可能會聯想到博弈論,由於兩我的的目標都是同樣的。不過稍加分析會發現,人老是拿不到最優的。

由於咱們選將能夠看做一個配對的過程,因此在選將ii後,第ii行和第ii列表格中行和列都是咱們的,在本身的行和本身的列交點處就是本身的武將對了。也就是說表格是對稱的。

分析樣例能夠得知,最優解老是每一行(整理後)排名第二大中最大的那個。也就是說,每一行的最大的那一組電腦是不可能讓你選到手的。一旦選擇了最大的一組中的其中一個,電腦總能夠先手把另外一半搶掉,因此每行最大的一組是不可能選出的。而咱們要證實次大中最大的那個是必定能夠選到的。

當咱們選擇了次大中最大的那一行,電腦就毫無疑問會把那一行中最大的一個給選出來。

此時咱們把次大中最大的另外一半給配上就能夠了。那咱們如今拿到了人所可能拿到的最大的一對武將,怎麼保證計算機不拿到比本身更大的武將呢?能夠看出,比當前已有的默契值更大的武將必定在其餘行中處於最大的位置,(假設計算機足夠聰明)若是計算機去選了那個位置,人先手去把它搶掉就好了。而計算機並無那麼聰明,它只會避免你去選能選的最大的武將,此時能夠分狀況討論。

計算機此時選擇一個武將有兩種影響:一是與原來的綠線相交,若是與綠線相交會直接肯定一組武將,此時人是阻止不了的。可是咱們能夠保證如今一條線與綠線的交點值必定小於人的答案。**反證:**若是那個值比人的答案(五角星)要大而比三角形要小,那麼次大中最大的就是這個值,所以這個值不可能在這個範圍;而若是那我的的值比三角形還大,那次大中最大的就是三角形了。所以與綠線的交點毫不會超過五角星。

第二種影響就是不與綠線相交。對於不與綠線相交的部分,只要人去把計算機最大的搶掉,計算機就不可能搶到每一行中最大的那個。

綜上所述,不管人仍是計算機都沒法搶到每一行中最大的那個,而根據貪心,人去選每行次大元素中最大的必定能選到,此時也能阻止計算機去選更大的元素。同時人不會輸。

Code:

#include<cstdio>
#include<algorithm>
using std::sort;
int a[510][510];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<n;i++)
        for(int j=i+1;j<=n;j++)
        {
            scanf("%d",&a[i][j]);
            a[j][i]=a[i][j];
        }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        sort(a[i]+1,a[i]+1+n);
        ans=ans>a[i][n-1]?ans:a[i][n-1];//選出排名第二中最大的那個
    }
    printf("1\n%d\n",ans);//必定有解
    return 0;
}
相關文章
相關標籤/搜索