[CP / Codeforces] B. Phoenix and Beauty (Div. 2) - 1400*

B. Phoenix and Beauty

进度

  • 24:??.?? - WA on test 1
  • 27:25.13 - AC

分析

根据题目要求,得知我们将要构造的数组中具有长度为 \(k\) 的循环节。显然,原数组中不相等的元素的值的数量不能超过 \(k\),否则这样的循环节是不存在的——总会出现不属于循环节的 “落单” 元素。

在满足上述条件后,我们就可以着手构造题目要求的数组了。最简单的做法是使循环节至少包含原数组中出现的所有值互不相同的元素各一个,如果此时循环节的长度还没有达到 \(k\),则任意选取原数组中的元素补齐剩余的长度。这样做所得到的最大数组长度为 \(k\cdot{}n\),因为题目限制 \(1\leq{}k\leq{}n\leq{}100\),所以 \(k\cdot{}n\leq{}10^4\),满足题目要求。

第一次 WA 是因为忘记补齐剩余的长度了。

我怎么感觉这道 1400* 还不如之前做的 1000*……

代码

void solve() {
    int n = 0, k = 0;
    std::cin >> n >> k;

    std::set<int> s;
    std::vector<int> v(n);
    for (int i = 0; i < n; i++) {
        std::cin >> v[i];
        s.insert(v[i]);
    }

    if (s.size() > k) {
        std::cout << "-1\n";
    } else {
        std::cout << n * k << '\n';
        for (int i = 0; i < n; i++) {
            for (auto e : s) {
                std::cout << e << ' ';
            }
            for (int j = 0; j < k - s.size(); j++) {
                std::cout << *s.cbegin() << ' ';
            }
        }
        std::cout << '\n';
    }
}
posted @ 2024-07-26 17:22  ZXPrism  阅读(11)  评论(0)    收藏  举报