CF1839A题解

  • 分析

    可以很容易地想到如果只有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;
}
posted @ 2023-10-23 10:01  Kazdale  阅读(427)  评论(0编辑  收藏  举报