原题链接:P1199 [NOIP2010 普及组] 三国游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意:给出n个武将,给出彼此的默契度,以默契度为战力,两人玩游戏,每次小涵先选,然后对方选择与小涵当前队列中武将默契度最高的武将,就是阻止小涵拿到与队列中武将默契度最高的武将,问是否必胜,如果胜,最后的默契度是多少

思路

是经典的博弈,对方每次贪心的选,是否存在策略使得必胜,每个武将的最佳搭配肯定选不了,那如果要赢,最好就是选择次大中的最大

首先,次大的最大肯定选得到,只要首次就选择次大所在的行的武将就可以在对方挑走最大后,选走次大

但是这样是否一定能赢呢?

要分情况看:

  • 对方选择的武将是与我们之前选的武将相交(即阻止的是之前武将的匹配) 之前武将的最大值已经被阻止,次大的最大已经被选了,此时与其之前的武将有相交,即确定了一个组合
    • 此值为最大 反证:如果为最大,比三角形还大,三角形又比五角星大,那三角形就是最大的次大,不符合假设
    • 此值大于五角星 反证:如果此值大于五角星,小于三角形,那么此值就是最大的次大,不合题意

也就是说不可能比所选的次大中的最大还大

也就是必胜

代码

#include <bits/stdc++.h>
 
using namespace std;
 
const int N = 550;
int a[N][N];
int n;
 
int main()
{
    cin >> n;
 
    int ans = 0;
    for(int i = 0; i < n; i ++)
    {
        int res_m = 0;
        for(int j = i + 1; j < n; j ++)
        {
            cin >> a[i][j];
            a[j][i] = a[i][j];
        }
 
        sort(a[i], a[i] + n);
        res_m = a[i][n - 2];
        //cout << res_M << endl << res_m << endl;
        ans = max(ans, res_m);
        //cout << res_m << endl;
    }
 
    cout << "1" << endl;
    cout << ans << endl;
 
    return 0;
}