description
小涵很喜歡電腦遊戲,這些天他正在玩一個叫做《三國》的遊戲。
在遊戲中,小涵和計算機各執一方,組建各自的軍隊進行對戰。遊戲中共有N 位武將(N
爲偶數且不小於4),任意兩個武將之間有一個“默契值”,表示若此兩位武將作爲一對組合
作戰時,該組合的威力有多大。遊戲開始前,所有武將都是自由的(稱爲自由武將,一旦某個自由武將被選中作爲某方軍隊的一員,那麼他就不再是自由武將了),換句話說,所謂的自由武將不屬於任何一方。遊戲開始,小涵和計算機要從自由武將中挑選武將組成自己的軍隊,規則如下:小涵先從自由武將中選出一個加入自己的軍隊,然後計算機也從自由武將中選出一個加入計算機方的軍隊。接下來一直按照“小涵→計算機→小涵→……”的順序選擇武將,直到所有的武將被雙方均分完。然後,程序自動從雙方軍隊中各挑出一對默契值最高的武將組合代表自己的軍隊進行二對二比武,擁有更高默契值的一對武將組合獲勝,表示兩軍交戰,擁有獲勝武將組合的一方獲勝。
已知計算機一方選擇武將的原則是儘量破壞對手下一步將形成的最強組合,它採取的具體策略如下:任何時刻,輪到計算機挑選時,它會嘗試將對手軍隊中的每個武將與當前每個自由武將進行一一配對,找出所有配對中默契值最高的那對武將組合,並將該組合中的自由武將選入自己的軍隊。
下面舉例說明計算機的選將策略,例如,遊戲中一共有6 個武將,他們相互之間的默契值如下表所示
小涵想知道,如果計算機在一局遊戲中始終堅持上面這個策略,那麼自己有沒有可能必勝?如果有,在所有可能的勝利結局中,自己那對用於比武的武將組合的默契值最大是多少?
假設整個遊戲過程中,對戰雙方任何時候均能看到自由武將隊中的武將和對方軍隊的武將。爲了簡化問題,保證對於不同的武將組合,其默契值均不相同。
analysis
-
其實電腦如果一直執行這樣的選將操作的話,那小涵必贏,電腦必輸
-
比如小涵這次選了第號武將,那麼電腦這次會選和x搭配最大默契值的第y號武將(題目已給出)
-
所以小涵不可能拿到搭配默契值最高的一對武將,但是小涵可以拿到默契值第二高的一對武將
-
但是電腦是跟着小涵的選擇來選的,就是說,對於每個武將電腦都是拿不到搭配最高和第二高的
-
所以,小涵必贏,次高默契值
-
首先小涵拿不到x的最優的y,但下一次可以拿的第二優的,或者是的最優的
-
但是電腦的貪心策略是要麼拿要麼拿看哪個大,而如果的話沒有貢獻,所以沒有意義
code
#include<cstdio>
using namespace std;
const int MAXN=501;
int a[MAXN][MAXN];
int n,ans;
int main()
{
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];
}
}
for(int i=1;i<=n;i++)
{
int maxx=0,maxy=0;
for(int j=1;j<=n;j++)
{
if(j!=i)
{
if(a[i][j]>maxx)
{
maxy=maxx;
maxx=a[i][j];
}
else if(a[i][j]>maxy)
{
maxy=a[i][j];
}
if(maxy>ans)ans=maxy;
}
}
}
printf("1\n%d\n",ans);
return 0;
}