C. Mind Control---------------------------------------思维(稍难)

You and your n−1 friends have found an array of integers a1,a2,…,an. You have decided to share it in the following way: All n of you stand in a line in a particular order. Each minute, the person at the front of the line chooses either the first or the last element of the array, removes it, and keeps it for himself. He then gets out of line, and the next person in line continues the process.

You are standing in the m-th position in the line. Before the process starts, you may choose up to k different people in the line, and persuade them to always take either the first or the last element in the array on their turn (for each person his own choice, not necessarily equal for all people), no matter what the elements themselves are. Once the process starts, you cannot persuade any more people, and you cannot change the choices for the people you already persuaded.

Suppose that you’re doing your choices optimally. What is the greatest integer x such that, no matter what are the choices of the friends you didn’t choose to control, the element you will take from the array will be greater than or equal to x?

Please note that the friends you don’t control may do their choice arbitrarily, and they will not necessarily take the biggest element available.

Input
The input consists of multiple test cases. The first line contains a single integer t (1≤t≤1000) — the number of test cases. The description of the test cases follows.

The first line of each test case contains three space-separated integers n, m and k (1≤m≤n≤3500, 0≤k≤n−1) — the number of elements in the array, your position in line and the number of people whose choices you can fix.

The second line of each test case contains n positive integers a1,a2,…,an (1≤ai≤109) — elements of the array.

It is guaranteed that the sum of n over all test cases does not exceed 3500.

Output
For each test case, print the largest integer x such that you can guarantee to obtain at least x.

Example
inputCopy

4
6 4 2
2 9 2 3 8 5
4 4 1
2 13 60 4
4 1 3
1 2 2 1
2 2 0
1 2
outputCopy
8
4
1
1
Note
In the first test case, an optimal strategy is to force the first person to take the last element and the second person to take the first element.

the first person will take the last element (5) because he or she was forced by you to take the last element. After this turn the remaining array will be [2,9,2,3,8];
the second person will take the first element (2) because he or she was forced by you to take the first element. After this turn the remaining array will be [9,2,3,8];
if the third person will choose to take the first element (9), at your turn the remaining array will be [2,3,8] and you will take 8 (the last element);
if the third person will choose to take the last element (8), at your turn the remaining array will be [9,2,3] and you will take 9 (the first element).
Thus, this strategy guarantees to end up with at least 8. We can prove that there is no strategy that guarantees to end up with at least 9. Hence, the answer is 8.

In the second test case, an optimal strategy is to force the first person to take the first element. Then, in the worst case, both the second and the third person will take the first element: you will end up with 4.

题意:
给你一个数组有n个数,有n个人站成一排,每个人可以取数组的首或尾元素。你站在第m个位置上,可以指定k个人拿首或者尾元素

解析:
这k个人是最前面的k个人。
假设前面拿i个,那么后面一定拿k-i
我排在第m位,我控制了k个人,那我前面就有k-m-1个人才能轮到我,而这些人可以随便取。
假设前面有j个人拿,那么后面就有m-k-1-j个人.然后我们需要搞清楚最开始的i和k-i是由我做决定的,jm-k-1-j是由别人做决定的。
那么我做决定的时候肯定想去最大的,别人肯定不想让你取最大的

所以我们枚举i,j,然后找最大。


#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1000;
int a[N];
int n,m,k;
int t;
int main()
{
	cin>>t;
	while(t--)
	{
		scanf("%d %d %d",&n,&m,&k);
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		k=min(m-1,k);
		int ans=0;
		for(int i=0;i<=k;i++) //枚举我控制的人
		{
			int tmp=0x3f3f3f3f;
			for(int j=0;j<=m-k-1;j++) //m-k-1是在我前面不受我控制的人,
				tmp=min(tmp,max(a[i+j+1],a[n-(k-i)-(m-k-1-j)]));//分别减去控制的人和非控制的人在后面取的个数
			ans=max(tmp,ans);
		}
		cout<<ans<<endl;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值