1 条题解

  • 0
    @ 2026-9-29 15:43:22

    本题可以采用二分答案的方法解决。

    先将牛到达的时间排序,然后二分最长等待时间即可。

    详细过程已经在代码里注释说明,这里不再赘述。

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int a[100005];
    int main()
    {
     //freopen("convention.in","r",stdin);
     //freopen("convention.out","w",stdout);
     int n,m,c;
     scanf("%d%d%d",&n,&m,&c);
     for(int i=1;i<=n;i++)
      scanf("%d",&a[i]);
     sort(a+1,a+n+1);
     int l=0,r=a[n]-a[1];
     while(l<r)
     {
      int mid=(l+r)>>1,cnt=1,sta=1;
      for(int i=1;i<=n;i++)
       if(a[i]-a[sta]>mid||i-sta+1>c)
       //如果等待时间超过了二分中点mid或当前车辆已经满载,就重新发一辆车
       {
       	cnt++;
       	sta=i;
       }
      if(cnt<=m)r=mid;//该时间下车辆数充足,等待时间可以更小
      else l=mid+1;//车辆不足,等待时间要更长
     }
     printf("%d\n",l);
     fclose(stdin);
     fclose(stdout);
     return 0;
    }
    
    • 1

    信息

    ID
    6778
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    37
    已通过
    9
    上传者