-
分析
可以很容易地想到如果只有1要求的话答案就是 \(\lceil \frac{n}{k} \rceil\)。
最优策略显然是在每个整除分块的第一位放一个1。
思考加入2条件如何修改。
显然当最后一块的大小不为1时,大于1的部分后缀和为0。
所以需要在最后一位加入一个1。
所以答案为\(\begin{cases}\lceil \frac{n}{k} \rceil(最后一个整除分块大小为一,即n \mod k = 1或者k = 1)\\ \lceil \frac{n}{k} \rceil + 1(最后一个整除分块大小不为1)\end{cases}\)思考正确性。
即当整除分块不为1时是否存在\(\lceil \frac{n}{k} \rceil\)的方案。
假设存在。
显然需要有一个1在最后。
所以对于\(n - 1, k\)只有1要求存在一个\(\lceil \frac{n}{k} \rceil - 1\)的合法方案。
由于最后一个块的大小大于1,所以对于\(n-1\)而言最后一个块仍然存在,所以\(\lceil \frac{n-1}{k} \rceil = \lceil \frac{n}{k} \rceil\)。
所以对于\(n, k\)只有1要求存在一个\(\lceil \frac{n}{k} \rceil - 1\)的合法方案。
显然先前已经得到答案为\(\lceil \frac{n}{k} \rceil\),而且由于\(n\)位置的前缀和为\(\lceil \frac{n}{k} \rceil\),所以必然不存在一种更优方案,与原命题得出的结论矛盾。
原命题证伪。 -
代码
#include <iostream>
using namespace std;
constexpr int MAXN(1000007);
int T, n, k;
inline void read(int &temp) { cin >> temp; }
inline int cil(int x, int y) { return (x / y) + (x % y != 0); }
inline void work() {
read(n), read(k);
if (k == 1) cout << n << endl;
else if (n % k <= 1) cout << n / k + 1 << endl;
else cout << n / k + 2 << endl;
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
read(T);
while (T--) work();
return 0;
}
标签:lceil,frac,分块,int,题解,CF1839A,整除,rceil
From: https://www.cnblogs.com/Kazdale/p/17781765.html