About G
  • 板块学术版
  • 楼主Nazq
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/7/27 11:33
  • 上次更新2025/7/27 18:57:38
查看原帖
About G
1051166
Nazq楼主2025/7/27 11:33

官解里证明了答案一定是 smins_{min} 复制无限次的前缀。然后我就复制 K1K - 1smins_{min},最后一次是 smins_{min} 的最短前缀。这咋 hack?

看到一种解法,就跑 10 次往前插最优的,然后最前面就只需要放最小的。正确性如何证明?

这是贪心代码。

    int n, k;
    cin >> n >> k;
    vector<string> v(n);

    for (int i = 0; i < n; i++) cin >> v[i];
    
    string mn = *min_element(v.begin(), v.end());
    if (k == 1) {
        cout << mn;
        return 0;
    }

    string ans, temp;
    auto cmp = [&](string a, string b) -> bool {
        string a1 = a + ans;
        string b1 = b + ans;
        return a1 <= b1;
    };

    for (int i = 0; i < min(10ll, k); i++) {
        sort(v.begin(), v.begin() + n, cmp);
        ans = v[0] + ans;
        temp = v[0];
    }

    for (int i = 0; i < k - 10; i++) cout << temp;
    cout << ans;

2025/7/27 11:33
加载中...