CSP历年复赛题-P1199 [NOIP2010 普及组] 三国游戏

原题链接:https://www.luogu.com.cn/problem/P1199

题意解读:人机轮流选将,电脑策略就是破坏可能和人已选能组成最大默契值的将,问人是否必胜,求出站的一对武将的默契值。

解题思路:

贪心题通常比较难以下手,经过分析,人肯定不可能选到每一行的最大默契值,因为电脑会破坏;

进一步思考,那人能选到第二大默契值也就可以保证必胜了,因为电脑也不可能选到最大默契值(最大值的其中一个被人捷足先登)

那么人应该选哪一个第二大的默契值呢 ?显然是选各行里第二最大默契值里最大的那一个。比如样例:


5 28 16 29 27 
23 3 20 1 
8 32 26 
33 11 
12 

补全后:

  1 2 3 4 5 6
1   5 28 16 29 27
2 5   23 3 20 1
3 28 23   8 32 26
4 16 3 8   33 11
5 29 20 32 33   12
6 27 1 26 11 12  

第一行:次大值28

第二行:次大值20

第三行:次大值28

第四行:次大值16

第五行:次大值32

第六行:次大值26

显然,选次大值最大的32更好。

因此,人是必胜,出站的一对武将默契值就是每行次大默契值里最大者。

100分代码:

#include <bits/stdc++.h>
using namespace std;

int n;
int a[505][505];
int ans;

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        for(int j = i + 1; j <= n; j++)
        {
            cin >> a[i][j];
            a[j][i] = a[i][j];
        }
    }

    for(int i = 1; i <= n; i++)
    {
        sort(a[i] + 1, a[i] + n + 1);
        ans = max(ans, a[i][n-1]); //更新每行次大值的最大者
    }
    cout << 1 << endl;
    cout << ans;

    return 0;
}

 

posted @ 2024-05-29 11:34  五月江城  阅读(38)  评论(0编辑  收藏  举报