题目链接: http://codeforces.com/contest/1175/problem/C
分析:这个题数据范围比较大。所以暴力一定不可以。
我们可以先想一个简单一点的序列。
给你一个n个数的序列。k = n - 1。那么这样的话,最优解一定是最小值+ 最大值 的一半。这样可以使这个b序列的第n个值最小(想一下就清楚了)。然后我们就可以利用尺取得方法每次考虑(k+1)的长度的序列,每次求出最优解。不断更新即可。
#include"stdio.h"
#include"string.h"
#include"algorithm"
using namespace std;
typedef long long ll;
int T,n,k;
int a[200010],b[200010],b1[200010],b2[200010];
int main()
{
scanf("%d",&T);
while(T --)
{
scanf("%d%d",&n,&k);
for(int i = 1; i <= n; i ++)
scanf("%I64d",&a[i]);
k ++;
ll M = 1000000101010;
ll id;
for(int i = k; i <= n; i ++)
{
int l = i - k + 1;
int mid = (a[i] + a[l]) / 2;
int maxx = max(mid - a[l],a[i] - mid);
if(maxx < M)
{
id = mid;
M = maxx;
}
}
printf("%I64d\n",id);
}
}