[AtCoder Regular Contest 101] C.Candles
[AtCoder Regular Contest 101] C.Candles
做题真不能纯用脑袋硬想- -这题早有思路了,但是处理一些边界条件有点复杂花了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;
}
---- suffer now and live the rest of your life as a champion ----