题意
给出一个长度为n的数组;
1 | 2 | 3 | … | n |
---|
可以可控制的将数组去掉首位变成n-k长度;
i | i+1 | i+2 | … | i+(n-k-1) |
---|
然后会不可控的将数组从首尾去掉元素变成n-m+1;
(i+j) | (i+j)+1 | (i+j)+2 | … | (i+j)+(n-m) |
---|
然后我们取剩下的数组中首尾第一个元素中最大的;
问最坏情况我们可以取到的最大值;
思路
我们将数组变为长度(n-k-1)的方案是可控的,选取哪一种都可以,所以可以在子情况中选最优解(最大值);
之后我们将数组变为长度(n-m-1)时,是不可以控制,考虑最坏情况,我们取最劣解(最小值);
代码
#include<bits/stdc++.h>
using namespace std;
int a[300000];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
k=min(k,m-1);
int s=n-m;
int ans=-1;
for(int i=0; i<=k; i++)//枚举可控制选取后留下的区间[i,i+n-k-1]
{
int Min=0x3f3f3f3f;
for(int j=0; j<m-k; j++)//枚举现在的区间[i,i+n-k-1]中被任意选取后留下的区间[i+j,i+j+n-m+1]
{
int l=i+j,r=i+j+(n-m);//i+j是左端点,n-m为最后留下的区间长度
Min=min(Min,max(a[l],a[r]));//因为是不可控的所以取最坏情况最小值;
//cout<<l<<r<<endl;
}
ans=max(ans,Min);//因为前k个是可控的,所以取最大值
}
printf("%d\n",ans);
}
return 0;
}
//6 6 4 2 2 9 2 3 8 5