poj上问题链接 河中跳房子
给出 L, N,M,L表示两岸最左边和最右边的石头的距离,最左边和最右边的石头不能移动,中间有N块石头都可以移走,要求移出M块石头,要求给出移出M块石头所能得到的移出后相邻两块石头间最短距离的最大值(因为移出不同的M块石头,所有相邻两块石头间的最小值可以不相同)。
其次给出N行,分别表示距离最左边石头的距离:最左边和最右边的石头距离最左边的石头的距离分别为a[0] = 0, a[N + 1] = L ,如果给出的是相邻两块石头距离,要先转换成距离最左边石头的方法再求解。
二分法(注意<bits/stdc++.h>包含了c以及c++的所有头文件,只需再加上using namespace std即可),枚举的mid实际上是猜测可能的最短距离,要求出最大的最短距离,所以用二分法多次求满足条件的,直到取得最大:
#include<bits/stdc++.h>
using namespace std;
int a[100000];
int main()
{
int L,N,M,low=0,high,i,j;
cin >> L >> N >> M;
for(i=1;i<=N;i++)
cin >> a[i];
a[N + 1] = L;
high = L + 1;
while(low + 1 < high)
{
int mid = ( low + high) / 2,k=0;
i=0;
while(i <= N)
{
j = i + 1;
while(a[j] - a[i] < mid && j < N + 2)
j++;
k += j - i - 1;
i = j;
}
if(k > M)
high = mid;//k > M说明移出的石头较多,mid取值较大,多移出石头才能得到较大的距离
else
low = mid;//k < M说明移出的石头较少,mid取值较小,不需要移出太多的石头,= M也可以进一步的简化
}
cout << low;
}
这题还是很难的,poj上也有这题,注意poj上提示TLE或者RE可能是因为数组太小的缘故。
几个输出:
下面从2个石头中取出1个可以得到最短距离的最大值是3

第二种:

&spm=1001.2101.3001.5002&articleId=100038655&d=1&t=3&u=a3883da83a344bd8a4745e6fe78a59ce)
643

被折叠的 条评论
为什么被折叠?



