打卡信奥刷题(2079)用C++实现信奥 P11522 [THUPC 2025 初赛] Harmful Machine Learning
摘要:题目描述了一个机器人在1×n网格上的移动游戏,机器人初始在位置x,目标是获取最大数字。游戏由多回合组成,每回合AI先交换两个数字,然后机器人移动或不动,并决定是否结束游戏获取当前格数字。双方都采取最优策略,AI希望最小化最终分数,机器人希望最大化。最终需要计算机器人能获得的最高分数。输入包含多组测试数据,每组给出网格长度、初始位置和数字序列,输出机器人能确保的最大分数。C++实现通过排序和比
P11522 [THUPC 2025 初赛] Harmful Machine Learning
题目背景
人工智能领域大神 The NIT 正在训练机器人 The BOT。
题目描述
The BOT 在一个 1 × n 1\times n 1×n 的网格上移动,其中在 ( 1 , i ) (1,i) (1,i) 上有数字 a i a_i ai。The BOT 初始在格子 ( 1 , x ) (1,x) (1,x), The BOT 想要走到一个数字尽量大的格子。每一步 The BOT 可以选择移动到相邻的一个格子或是不动,并且在移动后可以选择是否选择格子上的数字并结束游戏,而为了训练 The BOT 的能力,The NIT 会给出一些阻碍,在 The BOT 选择是否结束之后,The NIT 可以将两个数字交换位置。
具体地说,我们可以把整个游戏看成若干个回合,初始 The BOT 在位置 ( 1 , x ) (1,x) (1,x),在一个回合中,以下事件会按顺序依次发生:
- The NIT 选择两个位置 1 ≤ i , j ≤ n 1\leq i,j\leq n 1≤i,j≤n,并交换 a i , a j a_i,a_j ai,aj 的值,注意 i i i 可以等于 j j j,此时交换不会带来任何变化。
- The BOT 选择移动到一个相邻的位置或是原地不动,令 The BOT 现在所在的位置为 y y y,即选择 1 ≤ z ≤ n 1\leq z\leq n 1≤z≤n 且 ∣ z − y ∣ ≤ 1 |z-y|\leq 1 ∣z−y∣≤1,并移动到 ( 1 , z ) (1,z) (1,z)。
- The BOT 选择是否结束游戏,令 The BOT 现在所在的位置为 y y y,如果选择结束则会获得 a y a_y ay 的分数并立刻结束游戏,否则无事发生。
可以发现,如果 The BOT 一直不选择结束游戏,则游戏永远不会结束,为了防止这个情况的发生,在游戏的第 1 0 114514 10^{114514} 10114514 个回合,The BOT 必须选择立刻结束游戏。
The NIT 希望 The BOT 结束游戏时的分数最小,而 The BOT 希望这个分数最大。The NIT 和 The BOT 都是绝顶聪明的,但他们并没有时间玩 1 0 114514 10^{114514} 10114514 个回合,于是他们请你帮他们计算一下,The BOT 最终的分数是多少?
输入格式
本题含有多组测试数据。
第一行一个整数 T ( 1 ≤ T ≤ 1 0 5 ) T(1\leq T\leq 10^5) T(1≤T≤105),表示测试数据数量。
对于每一组数据:
第一行两个正整数 n , x ( 1 ≤ n ≤ 1 0 5 , 1 ≤ x ≤ n ) n,x(1\leq n\leq 10^5,1\leq x\leq n) n,x(1≤n≤105,1≤x≤n),分别表示网格的长度以及初始位置 ( 1 , x ) (1,x) (1,x)。
之后一行 n n n 个非负整数 a i ( 0 ≤ a i ≤ 1 0 9 ) a_i(0\leq a_i\leq 10^9) ai(0≤ai≤109)。
保证所有数据的 n n n 的总和不超过 5 × 1 0 5 5\times 10^5 5×105。
输出格式
对于每一组数据,输出一行一个数表示答案。
输入输出样例 #1
输入 #1
4
3 2
1 2 3
13 4
1 1 4 5 1 4 1 9 1 9 8 1 0
4 2
1 10 100 1000
1 1
114514
输出 #1
3
4
100
114514
说明/提示
题目来源
题目来自 THUPC2025(2025年清华大学学生程序设计竞赛暨高校邀请赛)初赛,信息来源于 THUSAAC 仓库。
C++实现
#include<bits/stdc++.h>
using namespace std;
int t,n,x;
void solve(){
cin>>n>>x;
vector<int>a(n+1),b;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=x-1;i<=x+1;i++){
if(1<=i&&i<=n)b.push_back(a[i]);
else b.push_back(0);
}
sort(a.begin()+1,a.end());
sort(b.begin(),b.end());
if(n<=2)cout<<a[n]<<"\n";
else cout<<max(a[3],b[1])<<"\n";
return;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--){
solve();
}
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐
所有评论(0)