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;
}
相关推荐
明月_清风1 小时前
从二叉树到 B+ 树:一文搞懂工程中「树」的演化之道
数据结构·算法·go
渡我白衣1 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
如意猴1 小时前
【C++】001--C++入门(1)
开发语言·c++
hetao17338371 小时前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法
Evand J2 小时前
【MATLAB例程,图像滤波5】 反谐波均值滑动窗口滤波(CHMF)图像降噪与质量评价,附代码下载链接
图像处理·算法·计算机视觉·matlab·均值算法·滑动窗口滤波·均值滑动
血小板要健康2 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
a187927218312 小时前
【算法】回溯算法(三):三记重锤与 N 皇后——记忆化、状态设计与三层漏斗
算法·leetcode·go·剪枝·回溯·n皇后·算法讲解
HugoStudio_SWAN4 小时前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法
青 春 记 忆5 小时前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode
raindayinrain5 小时前
c++并发
c++