以下内容参考该大佬题解
大佬博客
题解:
如果k >= m - 1的话,最终结果就是可控的,否则就要枚举所有情况
一重循环枚举可控情况,一重循环枚举不可控情况,时间负责都O(n2)
在可控情况下求最大,不可控情况求最小,每次取两端最大值
可控人数为k,不可控人数为m - 1 - k
假设可控的人中,有i个人取前端,不可控的人中有j个人取前端,那么你可以取的数就是前端a[i + j + 1],尾端a[n - (k - i) - (m - 1 - k - j)]
那么当前能取的最大值为max(a[i + j + 1], a[n - (k - i) - (m - 1 - k - j)])
代码如下:
int a[4000];
void solve()
{
int n, m, k; scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
k = min(m - 1, k);
int y = m - 1 - k;
int ans = 0;
for (int i = 0; i <= k; i ++ )// 可控求最大
{
int res = inf;
for (int j = 0; j <= y; j ++ )//不可控求最小
{
int t = max(a[i + j + 1], a[n - (k - i) - (y - j)]);//两端取最大
res = min(res, t);
}
ans = max(res, ans);
}
printf("%d\n", ans);
}
int main ()
{
int T; scanf("%d", &T);
while (T -- )
{
solve();
}
return 0;
}