CSP历年复赛题-P1199 [NOIP2010 普及组] 三国游戏
原题链接:https://www.luogu.com.cn/problem/P1199
题意解读:人机轮流选将,电脑策略就是破坏可能和人已选能组成最大默契值的将,问人是否必胜,求出站的一对武将的默契值。
解题思路:
贪心题通常比较难以下手,经过分析,人肯定不可能选到每一行的最大默契值,因为电脑会破坏;
进一步思考,那人能选到第二大默契值也就可以保证必胜了,因为电脑也不可能选到最大默契值(最大值的其中一个被人捷足先登)
那么人应该选哪一个第二大的默契值呢 ?显然是选各行里第二最大默契值里最大的那一个。比如样例:
6
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;
}