100分差一个点没过 求大佬指教
查看原帖
100分差一个点没过 求大佬指教
797884
Kir1楼主2023/1/13 17:59
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 1e6+10,inf=0x3f3f3f;
int a[N];
int d[N];
int n,m,s;
int l=inf ,r;
bool check(int x)//找最小值——转化为有至多n+1-m个区间的值比x大
{
    int cnt = 0;
    int sum = 0 ;
    for (int i = 1; i <= n+1;  )
    {
       if(d[i]>=x)
       {
           cnt++;
           i++;
       }else
       {
           while(sum<x)
           {
               sum+=d[i++];
           }
           sum=0;cnt++;
       }
    }
    if(cnt>=n+1-m) return true;
    return false;
}
int main()
{
    scanf("%d%d%d", &s, &n,&m);
    //移走一个石头 相当于合并数组d的两个区间 m次合并后就会有n+1-m个区间 所以说至多有n+1-m个区间
    for (int i = 1; i <= n; i ++ )
    {
        scanf("%d", &a[i]);
        d[i]=a[i]-a[i-1];
        l=min(l,d[i]),r+=d[i];
    }
    d[n+1]=s-a[n];
    l=min(d[n+1],l),r+=d[n+1];
    int ans;
    while(l<=r)
    {
        int mid = l+r>>1;
        if(check(mid)) l = mid+1,ans=mid;
        else r= mid-1;
    }
    printf("%d",ans);
}

hack数据是8 3 1 2 4 7 正确输出是 2 蒟蒻的输出是 3 求大佬指点 这个算法思路哪里错了

2023/1/13 17:59
加载中...