1175C.Electrification(尺取)

在OX轴上给您n个点a1,a2,…,an。现在,要求您在OX轴上找到这样一个整数点x,使得fk(x)最小可能。

函数fk(x)可以用以下方式描述:

形成距离列表d1,d2,…,dn,其中di = | ai-x | (ai和x之间的距离);
以降序对列表d进行排序;
结果是dk + 1。
如果有多个最佳答案,则可以打印其中的任何一个。

题解:

从左到右遍历每组连续的K个点,每组顶点的最左和最右元素的距离除2就是第K大的最小值,取最小即可。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;
int T;
int a[maxn];
int main () {
    scanf("%d",&T);
    int N,K;
    while (T--) {
        scanf("%d%d",&N,&K);
        for (int i=1;i<=N;i++) scanf("%d",&a[i]);
        int l=1;
        int r=K+1;
        int ans=0;
        int Min=1e9;
        while (l<=N-K) {
            int mid=(a[l]+a[r])>>1;
            int nowX=a[r]-mid;
            if (nowX<Min) {
                Min=nowX;
                ans=mid;
            }
            l++,r++;
        }
        printf("%d\n",ans);
    }
}

 

posted @ 2020-04-13 18:36  zlc0405  阅读(401)  评论(0编辑  收藏  举报