diff --git a/B3881.cpp b/B3881.cpp new file mode 100644 index 0000000..ebdf52b --- /dev/null +++ b/B3881.cpp @@ -0,0 +1,23 @@ +#include +#define int long long +using namespace std; +int n, k, p[1000005]; +signed main() { + scanf("%lld%lld%lld", &n, &k, &p[1]); + for (int i = 2; i <= k; ++i) + p[i] = p[i - 1] + ((p[i - 1] * 7ll + 7) % 10) + 1; + sort(p + 1, p + k + 1); + int ans = 0; + for (int l = 1, r = p[k] - p[1], mid = (l + r) >> 1; l <= r; mid = (l + r) >> 1) { + int cnt = 1, lst = p[1]; + for (int i = 2; i <= k && cnt < n; ++i) + if (p[i] - lst >= mid) + ++cnt, lst = p[i]; + if (cnt >= n) + ans = mid, l = mid + 1; + else + r = mid - 1; + } + printf("%lld\n", ans); + return 0; +} \ No newline at end of file diff --git a/B3881.md b/B3881.md new file mode 100644 index 0000000..03b2889 --- /dev/null +++ b/B3881.md @@ -0,0 +1,44 @@ +# B3881 [信息与未来 2015] 拴奶牛 + +## 题目描述 + +有 $n$ 头奶牛,有 $k$ 个木桩,每个木桩有一个位置,一个木桩上只能拴一头奶牛。由于奶牛好斗,所以在拴奶牛的时候,要求距离最近的奶牛的距离尽可能大。 + +例如 $n=4,k=6$,木桩的位置为 $0,3,4,7,8,9$,此时为下图。 +$$ +\begin{aligned} +\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} +\end{aligned} +$$ +有许多种拴牛方案,例如: +- $0,3,4,9$:此时最近距离为 $1$($3,4$ 之间); +- $0,3,7,9$:此时最近距离为 $2$。 + +## 输入格式 + +三个整数 $n,k,p_1$,其中 $p_1$ 为第 $1$ 个木桩的位置,其他木桩 $p_i(i\ge2)$ 的位置由下面公式给出: + +$p_i = p_{i-1} + ((p_{i-1}\times2357+137) \bmod 10)+1$。 + +## 输出格式 + +一个整数,即奶牛间最近距离的最大值。 + +## 输入输出样例 #1 + +### 输入 #1 + +``` +25 70 99 +``` + +### 输出 #1 + +``` +12 +``` + +## 说明/提示 + +$1\le n\le k\le10^6,0\le p_1\le100$。 \ No newline at end of file