讨论 / 综合了下面大佬的意见
lijie201602 2017-09-04 22:29:28
点我顶贴 收藏 删除
解答本题,必须看清题意,知道以下几点:

一、只需要选两次,由于比胜负靠的是双方武将中默契值最大的一对,所以除了默契值最大的一对,其他的武将都是没

用的。并因为小涵先选,并且题目要求输出默契值尽量大的。所以必须两次定胜负,只要一开始选择最优方案,之后也

就可以不用考虑了。

二、再深入分析,就会发现,小涵是输不了的。这是因为小涵永远掌握主动权,计算机一直都只是应付小涵,且大家可

以举例证明——小涵选一个将,计算机选走搭配默契值最大的武将,然后小涵选走默契值次大的武将,计算机把小涵选

走的两个武将中剩下搭配方案里默契值最大的选走。到这里就已经定下了胜负。此时,如果计算机的最大默契值比小涵

的小,那么毫无疑问小涵就赢了。而如果计算机的武将搭配默契值比小涵的大,那么小涵完全可以换方法选,从计算机

的方案的角度选,得到更优方案。依此类推,必定能赢。所以无论如何,小涵总会赢,我们可以直接把那个“1”输出

来。大家如果光看我的描述不能理解,可以自己举例子仿照样例画一张表,就能理解了。

三、逐步分析所有情况,会发现。在一个武将和其他所有武将的搭配方案中,默契值最大的是拿不到的。因为小涵不能

一下选两个,计算机又要和小涵抢。得到默契值最大的搭配方案,那是不可能的,想都别想。但是,小涵也没有这么悲

剧,这个游戏规则也有对小涵有利的一面。在一个武将和其他武将的搭配中,默契值次大的那对,小涵可以稳拿。因为

计算机会死板地被默契值最大的那对引开。这样搭配后默契值次大的武将,小涵就可以轻而易举地获得。

#include<cstdio>

int n,max=0,s1,s2,f[510][510];

int main()

{

scanf("%d",&n);

for(int i=1;i<=n-1;i++)

for(int j=i+1;j<=n;j++)

{

scanf("%d",&f[i][j]);

f[j][i]=f[i][j];

}

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

{

s1=s2=0;

for(int j=1;j<=n;j++)

{

if(f[i][j]>s1) { s2=s1; s1=f[i][j]; }

else if(f[i][j]>s2) s2=f[i][j];

}

if(s2>max) max=s2;

}

printf("1\n%d",max);

return 0;

}

#1 lijie201602@2017-09-10 22:43:06
回复 删除
啦啦啦
查看更多回复
提交回复