20250720题解
题目描述
有 n 头奶牛,有 k 个木桩,每个木桩有一个位置,一个木桩上只能拴一头奶牛。由于奶牛好斗,所以在拴奶牛的时候,要求距离最近的奶牛的距离尽可能大。
例如 n=4,k=6,木桩的位置为 0,3,4,7,8,9,此时为下图。
OllOOllOOO0 3 47 8 9
有许多种拴牛方案,例如:
- 0,3,4,9:此时最近距离为 1(3,4 之间);
- 0,3,7,9:此时最近距离为 2。
输入格式
三个整数 n,k,p1,其中 p1 为第 1 个木桩的位置,其他木桩 pi(i≥2) 的位置由下面公式给出:
pi=pi−1+((pi−1×2357+137)mod10)+1。
输出格式
一个整数,即奶牛间最近距离的最大值。
输入输出样例
输入 #1复制
25 70 99
输出 #1复制
12
说明/提示
1≤n≤k≤106,0≤p1≤100。
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,k;
long long p[N];
bool check(int x){int sum=1;int pre=p[1];for(int i=2;i<=k;i++){if(p[i]-pre>=x){sum++;pre=p[i];}}return sum>=n;
}
int main(){cin>>n>>k>>p[1];for(int i=2;i<=k;i++){p[i]=p[i-1]+((p[i-1]*2357+137)%10)+1;}int l=1,r=1e8;while(l<r){int mid=l+r+1>>1;if(check(mid))l=mid;else r=mid-1;}cout<<l;return 0;
}
0和3距离为3
3和4距离为1
4和9距离为5
最近距离为 1
0和3距离为3
3和7距离为4
7和9距离为2
最近距离为 2