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;
}
相关推荐
小七在进步几秒前
类和对象(五)
java·开发语言·算法
无名猿2 分钟前
std::optional 完全指南:别再用 -1 和 nullptr 表达「没有值」
c++·标准库·现代c++·语法基础
就叫年华吧丶10 分钟前
长文档点目录定位总是不准?一个 content-visibility + 平滑滚动引发的连环坑(Vue3 实战)
前端·javascript·算法·vue
FPGA信号处理17 分钟前
【信号检测与估计】第四节课:非高斯噪声下的 BLUE、极大似然与 EM 算法
人工智能·算法·机器学习
无名猿27 分钟前
nullptr 取代 NULL 和 0:空指针的三种写法和唯一正确解
c++·现代c++·语法基础·踩坑记录
大侠归来31 分钟前
C++ 与 Lua 的协程交互:从原理到实战
c++·lua·交互
无名猿39 分钟前
size_t 与 int 混用陷阱:有符号无符号比较与整数提升
c++·标准库·语法基础·踩坑记录
.道阻且长.43 分钟前
C++ 11:可变参数模板
前端·c++·算法
m0_380743871 小时前
Qt实现调用相机进行拍照并进行图像处理
开发语言·c++
励志不掉头发的内向程序员3 小时前
【从零写一个CAD 03】三个 double 值得单独一个类吗:把视图变换抽成 View
开发语言·c++·qt·学习·系统架构