[AtCoder Regular Contest 101] C.Candles

[AtCoder Regular Contest 101] C.Candles

image-20210120115924817

做题真不能纯用脑袋硬想- -这题早有思路了,但是处理一些边界条件有点复杂花了10分钟

简单来说,你所选择点亮的蜡烛一定是连续分布的。假如你选择了一个间断的蜡烛,那么中间那一部分的距离与其浪费不如将那些蜡烛点亮。因此,最终得到的点亮的蜡烛一定处于一个长度为K的连续区间上。不妨假设这个区间的左端点,求出最短距离。这个操作可以在\(O(n)\)的复杂度内完成。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int arr[N];

int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i = 1; i <= n; ++i){
        scanf("%d",&arr[i]);
    }
    int maxl = n-k+1;
    int ans = 0x3fffffff;

    for(int l = 1; l <= maxl; ++l){
        int r = l + k - 1;
        // [l,r] 
        if(arr[r] <= 0){
            ans = min(ans,-arr[l]);
        }else if(arr[l] >= 0){
            ans = min(ans,arr[r]);
        }else{
            ans = min(ans,min(arr[r] - 2 * arr[l],2 * arr[r] - arr[l]));
        }
    }

    printf("%d",ans);
    // system("pause");
    return 0;
}
posted @ 2021-01-21 20:46  popozyl  阅读(82)  评论(0编辑  收藏  举报