洛谷 P1749 [入门赛 #19] 分饼干 II 题解

题目传送门

先给结论:记 \(S=1+2+\dots+k\),则当 \(N\ge S\) 时为 YES,当 \(N<S\) 时为 NO

严谨一点,证明如下:

若能成功分配饼干,记 \(k\) 名小朋友拿到的饼干数量分别为 \(a_1,a_2,\dots,a_k\)。由于饼干数量各不相同且均为整数,不妨设 \(a_1<a_2<\dots<a_k\),则 \(a_2\ge a_1+1,a_3\ge a_2+1,\dots,a_k\ge a_{k-1}+1\)。由饼干数量至少为 \(1\) 得 \(a_1\ge 1\),所以 \(a_2\ge a_1+1\ge 2,a_3\ge 3.\dots,a_k\ge k\),不等式相加即得 \(a_1+a_2+\dots+a_k=N\ge 1+2+\dots+k=S\)。充分性得证。

\(a_1+a_2+\dots+a_k=N\ge 1+2+\dots+k=S\),则一定存在这样一组解:

\[a_i=\begin{cases}k+N-S&&i=k\\k&&0<i<k\end{cases} \]

该解满足题目要求。必要性得证。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll T, N, k, S;
int main(void) {
  cin >> T;
  while (T--) {
    cin >> N >> k;
    S = (1 + k) * k / 2; // 等差数列求和公式
    if (N >= S) cout << "Yes\n";
    else cout << "No\n";
  }
  return 0;
}

posted on 2024-01-27 14:14  UXOD  阅读(123)  评论(0编辑  收藏  举报