专栏文章

题解:CF435B Pasha Maximizes

CF435B题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip8x6xc
此快照首次捕获于
2025/12/03 08:05
3 个月前
此快照最后确认于
2025/12/03 08:05
3 个月前
查看原文

分析

这个问题是通过有限次数的相邻交换,让给定的数字尽可能大。关键在于如何分配这有限的交换次数,获得最大的数值提升。所以可以用 贪心算法 来解决。

思路

  • 从左到右遍历每一位数字。
  • 在当前位置 ii 和后面的 kk 个位置范围内,找到最大的数字。
  • 将找到的最大数字相邻交换移动到位置 ii,交换一次减少一次 kk
  • 处理下一个位置,直到用完所有交换次数或处理完所有的位置。

代码

CPP
#include <bits/stdc++.h>
using namespace std;
int main() {
    string a;
    int k;
    cin >> a >> k;
    int n = a.length();//在循环前算好n,可以节省复杂度。 
    for (int i = 0; i < n && k > 0; i++) {
        int maxx = i;
        for (int j = i + 1; j <= i + k && j < n; j++) {// 找出从位置i到i+k范围内的最大数字
            if (a[j] > a[maxx]) {
                maxx = j;
            }
        }
        
        
        for (int j = maxx; j > i; j--) {// 将最大数字移到当前位置i
            swap(a[j], a[j-1]);//交换 
            k--;//k减少一次 
            if (k == 0)
                break;
        }
    }
    
    cout << a << endl;//答案 
    
    return 0;
}

复杂度分析

  • 时间复杂度:最坏情况下为 O(n2)O (n^2)。因为在最坏情况下,每次都需要遍历 kk 个位置并进行 kk 次交换。
  • 空间复杂度:O(n)O (n),用于字符串表示。

评论

0 条评论,欢迎与作者交流。

正在加载评论...