一道很容易想的二分题啊,但是不知道为什么 为什么30行这里改成l-1能AC,写成r只有87.5%过,,,,(代码在下面/_ \
来源:牛客网
个人概括:暑假学校组织同学去景区爬山,景区设有缆车。希望缆车高度尽可能大。对于所有山只能取相同的缆车高度(但是高度可以任意),当山比缆车高时,需要走路上下山直到山另外一侧相同高度再坐缆车下山。要求所有山上走路的总路程大于等于运动指标。
暑假学校组织同学去景区爬山,但是当地的山峰分布十分奇特,所有的山峰都分布在一条东西走向的直线上(入口在东,出口在西),为了提高同学们的身体素质学校给同学们规定了一个“运动指标”,“运动指标“等于攀爬过程中上山高度与下山的高度的和。幸运的是景区给游客提供了缆车服务(缆车的行驶路线平行于地面),游客可以在景区入口选择任意一个高度乘坐缆车但是从此以后乘坐缆车的高度不能再发生改变,由于缆车不能穿过山体,所以当缆车的行驶高度低于当前山峰高度时缆车内游客需要在当前高度的东面山体下车并步行翻过山峰,当到达西面山体的缆车高度时游客需要继续乘坐缆车直到到达景区出口。例如景区三座山峰高度分别为100米、200米、150米,当选择缆车高度为120时,第一座山峰无需攀爬,第二座山峰需要攀爬80米,第三座山峰需要攀爬30米。 位置越高缆车上的风景越好,小明希望能看到最好风景但是同时需要满足学校要求的“运动指标”。
第一行两个正整数N、P,N表示景区山峰数量,P表示“运动指标”。
第二行N个正整数,表示每座山峰的高度。
(1<=N<=1e5,1<=P<=1e9,1<=山峰高度<=1e9)
一个非负整数表示你选择的缆车高度H,如果怎样安排都无法满足则输出-1。
一道很容易想的二分题啊,但是不知道为什么 为什么30行这里改成l-1能AC,写成r只有87.5%过,,,,
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n, p;
int h[N];
bool check(int x){
int sum = 0, dis;
for(int i = 1;i <= n; i++){
dis = h[i] > x ? h[i]-x : 0;
sum = sum+dis*2;
}
return sum >= p;
}
signed main(){
int l = 0, r = 0, mid;
scanf("%ld%ld", &n, &p);
for(int i = 1; i <= n; ++i){
scanf("%ld", &h[i]);
r = max(r, h[i]);
}
// sort(h+1, h+n+1);
while(l <= r){
mid = (l+r)/2;
if(check(mid))l = mid+1;
else r = mid-1;
}
if(r <= 0)r = -1;
printf("%ld", r);//这里改成l-1能AC,写成r只有87.5%过
return 0;
}