HJ174 交换到最大

  • 题目
  • 题解(26)
  • 讨论(9)
  • 排行

简单 通过率:41.93% 时间限制:3秒 空间限制:256M

知识点贪心

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

描述

给定一个仅由数字 0-90-9 构成的字符串 ss。一次操作可按如下方式进行:

∙ ∙ 从 ss 中选择既不是最左端字符也不为 00 的某一字符;

∙ ∙ 将该字符的数值减少 11;

∙ ∙ 随后把它与左侧相邻字符交换位置。

例如,字符串 "1023""1023" 经过一次操作可以变成 "1103""1103" 或 "1022""1022"。

你可以不限次数地执行上述操作。请计算能够得到的字典序最大的字符串,并输出该字符串。

输入描述:

第一行输入一个整数 t(1≦t≦104)t(1≦t≦104),表示测试用例数量。

此后 tt 行,每行输入一个不含前导零的数字字符串 ss,满足 1≦∣s∣≦2×1051≦∣s∣≦2×105。

保证所有测试用例的 ∣s∣∣s∣ 之和不超过 2×1052×105。

输出描述:

对于每个测试用例,在一行上输出通过任意次数操作后能够得到的字典序最大的字符串。

示例1

输入:

复制代码
6
19
1709
11555
51476
9876543210
5891917899

复制输出:

复制代码
81
6710
33311
55431
9876543210
7875567711

复制说明:

复制代码
以 "19""19" 为例:
∙ ∙ "19""19" →→ "89""89";
∙ ∙ "89""89" →→ "81""81",得到答案 "81""81"。

再以 "1709""1709" 为例,可按如下序列操作:
∙ ∙ "1709""1709" →→ "1780""1780";
∙ ∙ "1780""1780" →→ "6180""6180";
∙ ∙ "6180""6180" →→ "6710""6710",最终得到答案 "6710""6710"。
cpp 复制代码
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

void solve() {
    string s;
    cin >> s;
    int n = s.length();

    for (int i = 0; i < n; ++i) {
        int best_val = s[i] - '0';
        int best_pos = i;

        // 在窗口内寻找能产生最大价值的来源
        for (int j = i; j < min(i + 10, n); ++j) {
            int current_val = (s[j] - '0') - (j - i);
            if (current_val > best_val) {
                best_val = current_val;
                best_pos = j;
            }
        }

        // 物理移动来源字符到当前位置i
        while (best_pos > i) {
            swap(s[best_pos], s[best_pos - 1]);
            best_pos--;
        }
        
        // 将当前位置i的字符值更新为计算出的最优值
        s[i] = (char)(best_val + '0');
    }
    cout << s << endl;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}
相关推荐
Full Stack Developme36 分钟前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
Jerry2 小时前
LeetCode 707. 设计链表
算法
疋瓞2 小时前
python和C++对比(1)_数据类型和数据结构
数据结构·c++·python
C语言小火车2 小时前
C++ 堆排序深度精讲:基于完全二叉树的选择排序进化,最坏情况 O(n log n) 的稳定王者
开发语言·c++·算法·排序算法·堆排序
kebidaixu2 小时前
两轮BMS AFE SH367306 I2C 读写时序
算法
智能排队系统_头部供应商2 小时前
RK3588边缘网关改造银行排队系统实战
算法
Fabarta3 小时前
从 0 实现 ChatGPT 风格的流式对话 UI
算法·架构
手写码匠3 小时前
手写 AI 上下文压缩系统:从零实现 Prompt 压缩与选择性上下文管理
人工智能·深度学习·算法·aigc
ALex_zry3 小时前
C++26 std::complex 结构化绑定详解:auto [re, im] = c
c语言·开发语言·c++