POJ 3258 (固定划分的最大距离)

    xiaoxiao2021-04-11  34

    题意:

    有一条河,两边各看作有一块石头,河中有n块石头,总计n+2块石头,现在要去除 m块石头,怎么去除才能使得剩下的石头最近的距离最大。

    思路:

    二分最小的距离,那么在判断条件的时候如果距离大于mid 时候就当作一个组。 难点在于,当num == m的时候还要继续去寻找。(现在还是很难理解,感觉 应该是适合于这道题。)

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 50005; __int64 L; int n,m; int a[MAXN]; int main() { //freopen("in.txt","r",stdin); scanf("%I64d%d%d",&L,&n,&m); int l = 0,r = L; a[0] = 0; a[n+1] = L; for(int i = 1;i <= n + 1; i++) { if(i <= n) scanf("%d",&a[i]); if(l > a[i] - a[i-1]) l = a[i] - a[i-1]; } sort(a,a+2+n); while(l <= r) { int mid = (l+r)>>1; __int64 sum = 0; int num = 0; for(int i = 1;i <= n+1; i++) { if((sum += a[i]-a[i-1]) <= mid) { num++; } else { sum = 0; } } if(num <= m) //难点 l = mid + 1; else r = mid - 1; } printf("%d\n",l); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-666500.html

    最新回复(0)