【每日一题】Problem 44E. Anfisa the Monkey

发布时间 2023-06-12 21:41:28作者: HelloEricy

原题

解决思路

由题意可得 \(ak \le size \le bk\),因此当条件不符合该要求时即可退出
因为 \(size \le bk\),因此,我们可以假设每行都是 \(b\) 长度来满足条件二,因此第 \(i\) 行的长度为 \(len = size - (k-i)b\),然后对 \(len\) 取与 \(a\) 中的较大者来满足条件一

注意,如果后续行每行都取最大值 \(b\),可能会导致 \(len \lt 0\),这表明后续行无法每行都取 \(b\) 长度(条件二成立),同时 \(len = max(len, a)\) 又保证了条件一的成立,因此结果符合要求

#include <bits/stdc++.h>

int main() {
    int k, a, b; std::cin >> k >> a >> b;
    std::string letters; std::cin >> letters;

    if (k * a > letters.size() || k * b < letters.size()) {
        std::cout << "No solution\n";
    } else {
        int pos, len, size;
        pos = len = 0, size = letters.size();
        for (int i = 1; i <= k; ++i) {
            len = size - (k - i) * b;
            len = std::max(a, len);
            std::cout << letters.substr(pos, len) << std::endl;

            size -= len;
            pos += len;
        }
    }

    return 0;
}