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;
}
分类:
CSP-J复赛真题解析
标签:
贪心
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!