讨论 / 三国游戏 题解(NOIP2010 NO.4)
wh3z_wsc 2011-11-10 06:14:00
点我顶贴 收藏 删除
(from TYVJ 由 lipoqil、wangminrui、xzm2000、任其逍遥编辑)

解答本题,必须看清题意,知道以下几点:

一、只需要选两次,由于比胜负靠的是双方武将中默契值最大的一对,所以除了默契值最大的一对,其他的武将都是没用的。并因为小涵先选,并且题目要求输出默契值尽量大的。所以必须两次定胜负,只要一开始选择最优方案,之后也就可以不用考虑了。

二、再深入分析,就会发现,小涵是输不了的。这是因为小涵永远掌握主动权,计算机一直都只是应付小涵,且大家可以举例证明——小涵选一个将,计算机选走搭配默契值最大的武将,然后小涵选走默契值次大的武将,计算机把小涵选走的两个武将中剩下搭配方案里默契值最大的选走。到这里就已经定下了胜负。此时,如果计算机的最大默契值比小涵的小,那么毫无疑问小涵就赢了。而如果计算机的武将搭配默契值比小涵的大,那么小涵完全可以换方法选,从计算机的方案的角度选,得到更优方案。依此类推,必定能赢。所以无论如何,小涵总会赢,我们可以直接把那个“1”输出来。大家如果光看我的描述不能理解,可以自己举例子仿照样例画一张表,就能理解了。

三、逐步分析所有情况,会发现。在一个武将和其他所有武将的搭配方案中,默契值最大的是拿不到的。因为小涵不能一下选两个,计算机又要和小涵抢。得到默契值最大的搭配方案,那是不可能的,想都别想。但是,小涵也没有这么悲剧,这个游戏规则也有对小涵有利的一面。在一个武将和其他武将的搭配中,默契值次大的那对,小涵可以稳拿。因为计算机会死板地被默契值最大的那对引开。这样搭配后默契值次大的武将,小涵就可以轻而易举地获得。

#1 2926065656@2017-01-21 19:05:21
回复 删除
var a:array[1..500,1..500]of 0..1000000000;

b,c:array[0..500]of 0..1000000000;

n,i,j:1..500;

begin

readln(n);

for i:=1 to n-1 do

for j:=i+1 to n do begin

read(a[i,j]);

a[j,i]:=a[i,j];

end;

writeln(1);

for i:=1 to n do begin

for j:=1 to n do if a[i,j]>b[i] then b[i]:=a[i,j];

for j:=1 to n do if (a[i,j]>c[i])and(a[i,j]<b[i]) then c[i]:=a[i,j];

if c[i]>b[0] then b[0]:=c[i];

end;

writeln(b[0]);

end.

查看更多回复
提交回复