NOIP2010 普及組複賽 第四題 三國遊戲

2022-05-13 04:16:34 字數 2756 閱讀 7112

題目描述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。

輸入輸出樣例sample input/output

樣例測試點#1

輸入樣例:

【輸入樣例1】

6 5 28 16 29 27

23 3 20 1

8 32 26

33 11

12 【輸入樣例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輸出樣例:

【輸出樣例1】132

【輸出樣例2】177

說明description

【資料範圍】 

對於 40%的資料有 n≤10。 

對於 70%的資料有 n≤18。 

對於 100%的資料有 n≤500

思路:這題呢,雖然是第四題,其實十分簡單呢。。。

運用遞推,仔細想一下:

①從題目中可以隱約讀出:小涵必勝

②如果要使小涵最大,那麼必須要讓計算機選最大的,小涵選第二大的,才可以

實現過程:先把這個三角形補成乙個正方形陣,然後掃瞄每一行,把整個矩陣的每行的第二大值存入陣列,找出這個陣列中的最大的,這個就是正解!

找第二大的過程:

①種情況:最大值和次大值依次迭代掉,最大值變為次大值,然後取新的最大值

②種情況:默契值[i,j]在最大值和次大值之間的情況,迭代次大值即可,最大值不變

最後次大值站首位,輸出即可!

**如下:

1 #include 2 #include 3

int fun(const

void *a,const

void *b)//

小 4

7int

main() 89

20} 21 flag=a[0][0];//

22 flag2=a[0][0];//

??

23 flag3=0;//

???

24for(i=1;i<=n;i++)

25

33else

if(a[i][j]>flag2)

34

37}

38if(flag2>flag3) flag3=flag2;

39 flag=0

; 40 flag2=0

;

41}

42 printf("

1\n%d\n

",flag3);

43return

0;

44 }

NOIP 2010 普及組解題報告

題目分析 一 數字統計 此題,曾經在某oj上看到過原題。要求和實現都非常簡單。無非是,列舉出所有在範圍內的數字,然後對數字進行拆分,對每一位數字進行判斷。乙個樸素的for迴圈,巢狀乙個while迴圈,就可以解決這道題目。下面是程式的核心部分 for i l i r i 此題丟分,絕對可以認為是絕不應...

NOIP2010 普及組 數字統計

題目鏈結 題目描述 請統計某個給定範圍 l,r 的所有整數中,數字 2 出現的次數。比如給定範圍 2,22 數字 2 在數 2 現了 1 次,在數 12 現 1 次,在數 20 現 1次,在數 21 現 1 次,在數 22 現 2次,所以數字 2 在該範圍內一共出現了 6次。輸入格式 2個正整數 l...

NOIP 2010 普及組解題報告

題目分析 一 數字統計 此題,曾經在某oj上看到過原題。要求和實現都非常簡單。無非是,列舉出所有在範圍內的數字,然後對數字進行拆分,對每一位數字進行判斷。乙個樸素的for迴圈,巢狀乙個while迴圈,就可以解決這道題目。下面是程式的核心部分 for i l i r i t i while t 0 y...