P2678 跳石头
[题目链接]https://www.luogu.com.cn/problem/P2678
题意
在起点和终点之间,有 N 块岩石(不含起点和终点的岩石)。组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长,组委会至多从起点和终点之间移走 M 块岩石(不能移走起点和终点的岩石)
思路
- 相邻两个间比较
- 利用二分法求出两个石头间最大距离
坑点
- 过程较复杂,要正确理解题意
算法一:XX+XX
时间复杂度
$
实现步骤
- 找出去除的石头后,找到剩下两组间的最大值
代码
long long int n,m,high[1000000+10];
long long int tmp,left,right;
int main()
{
scanf("%lld%lld",&n,&m);//注意读入输出要使用lld
for(long long int i=1;i<=n;i++){
scanf("%lld",&high[i]);
if(high[i]>right){
right=high[i];//找到最大的high[i]做为right
}
}
while(left<=right){
int mid=(left+right)/2;
//printf("%d ",mid);
tmp=0;
for(int i=1;i<=n;i++){
if(high[i]>mid){
tmp+=high[i]-mid;
}
}
if(tmp<m) right=mid-1;
else left=mid+1;
}
printf("%lld",right);//输出最终结果
return 0;//不加return 0 结果return WA;
}
算法二:XX+XX
时间复杂度
$
实现步骤
- x
- x
- x
代码
总结
正确理解题意,正确使用二分法解决问题