https://vjudge.net/problem/CodeForces-1291C
题目大意:给
n
n
n个整数的数组
a
a
a,
n
n
n个人依次选取数组的第一个元素或最后一个元素作为它的得分,你是第
m
m
m个选择的,你可以在游戏开始前指定
k
k
k个人选取第一个元素或最后一个元素(不要求
k
k
k个人保持一致 可以为每一个人指定)。问在这些人随意选择的情况下你的得分最低是多少。
思路:题目扯了一堆,其实就是让你求最坏情况。如果 k > = m − 1 k>=m-1 k>=m−1,那么显然答案是 a [ 1 … … m ] a[1……m] a[1……m]和 a [ n − m + 1 … … n ] a[n-m+1……n] a[n−m+1……n]中的最大值;如果 k < m − 1 k<m-1 k<m−1,因为数据范围不大,所以我们可以枚举这 k k k个人选择的情况: k k k个人选最后一个; 1 1 1个人选第一个, k − 1 k-1 k−1个人选最后一个;……; k k k个人选第一个。对于每种情况,剩下了 n − k n-k n−k个人,且在你之前还有 m − k − 1 m-k-1 m−k−1个人要选择,再用上述方式枚举这 m − k − 1 m-k-1 m−k−1个人的选择即可。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int t,n,m,k;
int a[3505];
int cal(int l,int r,int v)
{
int ans=INF;
for(int i=0;i<=v;i++)
ans=min(ans,max(a[l+i],a[r-v+i]));
return ans;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int ans=0;
if(k>=m-1)
{
for(int i=1;i<=m;i++)
ans=max(ans,a[i]);
for(int i=n;i>n-m;i--)
ans=max(ans,a[i]);
}
else
{
int num=m-k-1;
ans=cal(1,n-k,num);
for(int i=1;i<=k;i++)
ans=max(ans,cal(i+1,n-k+i,num));
}
printf("%d\n",ans);
}
return 0;
}