题意:有n个人和n个数
a
k
a_k
ak,依次每个人可以从头或尾拿走一个数,你是第m个人,你想让你拿的数尽量大,而且你可以说服k个人,控制他们选择头或尾,没有说服的人从头或尾拿是完全随机的,给定n,m,k和数列,求你能拿到的数x不小于多少。
题解:如果k≥m-1,那么我前面的人我都可以控制,那么我就可以从前m个,后m个中挑个最大的,如果k<m-1,那么要考虑不能控制的人取的所有情况,结果是这些情况中最坏的结果。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 5e3+10;
int a[maxn];
int b[maxn];
int n, m, k;
int main(){
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
if(m <= k+1)
{
int ans = -1;
for(int i = 1; i <= m; i++)
{
ans = max(ans, a[i]);
ans = max(ans, a[n-i+1]);
}
printf("%d\n", ans);
}
else
{
int j = 1;
for(int i = 1; i <= m; i++)
{
b[j++] = max(a[i], a[n-m+i]);
}
int ans = -1;
for(int i = 1; i <= k+1; i++)
{
int aans = 0x3f3f3f3f;
for(int j = i; j <=i+m-k-1; j++)
{
aans = min(aans, b[j]);
}
ans = max(ans, aans);
}
printf("%d\n", ans);
}
}
return 0;
}