NOIP2010 三國遊戲

題目描述 Description
  小涵很喜歡電腦遊戲,這些天他正在玩一個叫做《三國》的遊戲。
  在遊戲中,小涵和計算機各執一方,組建各自的軍隊進行對戰。遊戲中共有 N 位武將(N爲偶數且不小於 4),任意兩個武將之間有一個“默契值”,表示若此兩位武將作爲一對組合作戰時,該組合的威力有多大。遊戲開始前,所有武將都是自由的(稱爲自由武將,一旦某個自由武將被選中作爲某方軍隊的一員,那麼他就不再是自由武將了),換句話說,所謂的自由武將不屬於任何一方。
  遊戲開始,小涵和計算機要從自由武將中挑選武將組成自己的軍隊,規則如下:小涵先從自由武將中選出一個加入自己的軍隊,然後計算機也從自由武將中選出一個加入計算機方的軍隊。接下來一直按照“小涵→計算機→小涵→……”的順序選擇武將,直到所有的武將被雙方均分完。然後,程序自動從雙方軍隊中各挑出一對默契值最高
的武將組合代表自己的軍隊進行二對二比武,擁有更高默契值的一對武將組合獲勝,表示兩軍交戰,擁有獲勝武將組合的一方獲勝。
  已知計算機一方選擇武將的原則是儘量破壞對手下一步將形成的最強組合,它採取的具體策略如下:任何時刻,輪到計算機挑選時,它會嘗試將對手軍隊中的每個武將與當前每個自由武將進行一一配對,找出所有配對中默契值最高的那對武將組合,並將該組合中的自由武將選入自己的軍隊。 下面舉例說明計算機的選將策略,例如,遊戲中一共有 6 個武將。
小涵想知道,如果計算機在一局遊戲中始終堅持上面這個策略,那麼自己有沒有可能必
勝?如果有,在所有可能的勝利結局中,自己那對用於比武的武將組合的默契值最大是多
少?
  假設整個遊戲過程中,對戰雙方任何時候均能看到自由武將隊中的武將和對方軍隊的武將。爲了簡化問題,保證對於不同的武將組合,其默契值均不相同。
 輸入輸出格式 Input/output
輸入格式:
輸入文件名爲 sanguo.in,共 N 行。
第一行爲一個偶數 N,表示武將的個數。
第 2 行到第 N 行裏,第(i+1)行有(Ni)個非負整數,每兩個數之間用一個空格隔
開,表示 i 號武將和 i+1,i+2,……,N 號武將之間的默契值(0≤默契值≤1,000,000,000)。
輸出格式:
輸出文件 sanguo.out 共 1 或 2 行。
若對於給定的遊戲輸入,存在可以讓小涵獲勝的選將順序,則輸出 1,並另起一行輸出
所有獲勝的情況中,小涵最終選出的武將組合的最大默契值。
如果不存在可以讓小涵獲勝的選將順序,則輸出 0。

題解:這道題其實是個水題,普及組難度嘛……我們可以發現小涵肯定能贏。因爲,先手必贏啊!哈哈哈其實這設定就是先手必贏。我們可以發現如果計算機只能被動拆小涵每次選擇武將的最大默契,那麼上次選擇的就無力拆散了。因此每個武將第二大的肯定不會被拆散。所以我們只需要找第二大的中的最大值即可。

代碼:
    #include<iostream> 
    #include<cstdio> 
    #include<algorithm> 
    using namespace std; 
     
    int map[505][505]; 
     
    int main() 
    { 
        int n; 
        int ans=0;  
        cin >> n; 
        for (int i=1; i<=n; i++) 
        { 
            int max1=0,max2=0; 
            for (int j=i+1; j<=n; j++)  
            { 
                int a; 
                cin >> a; 
                map[i][j]=map[j][i]=a; 
            } 
        } 
         
        for (int i=1; i<=n; i++)  
        { 
            int max1=0,max2=0; 
            for (int j=1; j<=n; j++) 
            { 
                int a=map[i][j]; 
                if (a>max1) { max2=max1; max1=a; continue; }  
                if (a>max2) max2=a; 
            } 
            ans=max(ans,max2); 
        } 
        cout << 1 << endl; 
        cout << ans; 
        return 0; 
    } 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章