大佬求指教,提交为全红,样例通过了
查看原帖
大佬求指教,提交为全红,样例通过了
1366067
wei_learn_city楼主2024/10/17 15:44

[信息与未来 2015] 拴奶牛

题目描述

nn 头奶牛,有 kk 个木桩,每个木桩有一个位置,一个木桩上只能拴一头奶牛。由于奶牛好斗,所以在拴奶牛的时候,要求距离最近的奶牛的距离尽可能大。

例如 n=4,k=6n=4,k=6,木桩的位置为 0,3,4,7,8,90,3,4,7,8,9,此时为下图。

\underline\text{\qquad O\quad l\quad l\quad O\quad O\quad l\quad l\quad O\quad O\quad O\qquad}\\ \text{\qquad 0\quad\ \quad\ \ \quad 3\ \quad 4\quad\quad\quad\quad 7\quad\ 8\quad\ 9\qquad}\\

有许多种拴牛方案,例如:

  • 0,3,4,90,3,4,9:此时最近距离为 113,43,4 之间);
  • 0,3,7,90,3,7,9:此时最近距离为 22

输入格式

三个整数 n,k,p1n,k,p_1,其中 p1p_1 为第 11 个木桩的位置,其他木桩 pi(i2)p_i(i\ge2) 的位置由下面公式给出:

pi=pi1+((pi1×2357+137)mod10)+1p_i = p_{i-1} + ((p_{i-1}\times2357+137) \bmod 10)+1

输出格式

一个整数,即奶牛间最近距离的最大值。

样例 #1

样例输入 #1

25 70 99

样例输出 #1

12

提示

1nk106,0p11001\le n\le k\le10^6,0\le p_1\le100

#include<bits/stdc++.h>
using namespace std;
long long n,k,s1;

long long p[1000010];
bool check(long long x)
{
    long long index=1,cnt=1;
    for(long long i=2;i<k;i++)
    {
        if(p[i]-p[index]>=x)
       {
           index=i;
           cnt++;
       }
    }
    if(cnt>=n)
    {
        return true;
    }else
        return false;
}
int main()
{
    cin>>n>>k>>s1;
    p[1]=s1;
    for(long long i=2;i<=70;i++)
        p[i]=p[i-1]+((p[i-1]*2357+137)%10)+1;
    sort(p+1,p+k+1);
    long long l=1,r=p[k];
    while(l<r)
    {
        long long mid=(l+r+1)>>1;
        if(check(mid))
        {
            l=mid;
        }else
            r=mid-1;
    }
    cout<<l;
}
2024/10/17 15:44
加载中...