ACM 训练日志记录 · 思考 · 成长 提交 / 修改记录
王梓豪 / 题目列表训练档案
导出

P17309 [入门赛 #51] 千秋的数学探究活动没有问题

来源:洛谷 ★ 1000

本题活力0.23按难度、完成结果与训练证据估算

算法如山行则将至

题目描述

计算翻转S中不超过k位连续数位后可能的最大值。

代码

#include <bits/stdc++.h>
using namespace std;
string solve(string a, int k)
{
    if (a.empty())
    {
        return "";
    }
    int max_=-1,cnt = 0;
    int len=min((int)a.size(), k);
    for (int i = 0; i < len; i++)
    {
        if (a[i] - '0' > max_)
        {
            max_ = a[i] - '0';
            cnt = 1;
        }
        else if (a[i] - '0' == max_)
        {
            cnt++;
        }
    }
    string best = a;
    for (int i = 0; i < len; i++)
    {
        if (a[i] - '0' == max_)
        {
            string s = a;
            reverse(s.begin(), s.begin() + i + 1);
            if (s > best)
            {
                best = s;
            }
        }
    }
    string s;
    if (a.size() == 1)
    {
        s = a;
    }
    else
    {
        s = string(1, a[0]) + solve(a.substr(1), k);
    }
    if (s > best)
    {
        best = s;
    }
    return best;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, k;
    cin >> n >> k;
    long long temp, total = 0;
    for (int i = 0; i < n; i++)
    {
        cin >> temp;
        total += temp;
    }
    string a = to_string(total);
    string ans = solve(a, k);
    long long result = 0;
    for (char c : ans)
    {
        result = result * 10 + c - '0';
    }
    cout << result << '\n';
    return 0;
}