题目链接:http://codeforces.com/problemset/problem/435/B

题目意思:给出一个最多为18位的数,可以通过对相邻两个数字进行交换,最多交换 k 次,问交换 k 次之后,这个数最大可以变成多少。

不知道最近是不是疏于训练(一直研究百度之星的题目,最终决定就是暂时放下,可能能力还没达到做那种题目的水平,不过都好感谢乌冬兄耐心甘为我解答左两道题目),昨晚又想学学拓扑排序(SPFA提到),结果没看明白= =...再加上昨晚比赛...电脑卡机卡得要命,于是悲催了= =

这个是赛后做的......做的时候不知道怎么在尽可能贪心和k次这个约束条件下取舍...看了别人的,一下子豁然开朗,晚上一打即过,哈哈哈....

大方向就是要往贪心的策略来想。怎样贪心?当然是把位数越大的数字越往高位移动,这样保证最终得到的数尽量大,但是,有一个关键的约束条件,就是不能超过 k 次,暗含的意思就是,装载着数字比较大的位,移动到高位的距离不能超过 k 这个长度。

以这组数据为例:

由于最高位的数字 9 是最大的,所以没必要讨论该位。那么从第二位数字0开始,后面的位中最大的那个数是第三位的9,将它与第二位数字交换,变成9900000078001234,次数从6变为5(因为交换了一次)....接着问题出现了,第三位的0究竟是拿最大的8(符合贪心的策略)不断与前面的数交换,还是拿次小的7不断与前面的数交换呢?如果是8,当交换5次之后,结果变成9900800007001234,而如果用7交换,结果变成9907000008001234,明显是后面的数比较大。

所以贪心不能乱贪,前提条件就是紧紧地遵循交换次数最多不能超过当前允许的次数。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7
 8 const int maxn = 18 + 5;
 9 char s[maxn];
10
11 int main()
12 {
13     int k;
14     while (cin >> s >> k)
15     {
16         int len = strlen(s);
17         for (int i = 0; i < len; i++)
18         {
19             int t = i;      // 讨论第i位的数,后面有没有更大的数可以替代它
20             for (int j = i+1; j < len && j-i <= k; j++)   // j-i <= k就是满足交换次数(实质就是j到i的距离)不能超过剩下最多能交换的次数k
21             {
22                 if (s[j] > s[t])
23                     t = j;     // 找出最大数的下标,前提是不超过k的次数
24             }
25             k -= (t-i);
26             while (t != i)   // 代表找到比要讨论的当前最高位要大的数
27             {
28                 swap(s[t], s[t-1]);   // 不断向前交换
29                 t--;
30             }
31         }
32         cout << s << endl;
33     }
34     return 0;
35 }

转载于:https://www.cnblogs.com/windysai/p/3762799.html

codeforces 435 B. Pasha Maximizes 解题报告相关推荐

  1. CodeCraft-19 and Codeforces Round #537 (Div. 2)解题报告

    Codeforces Round #537 (Div. 2) 题解报告 A. Superhero Transformation 题意 问能否通过把辅音字母换成另一个辅音字母,元音字母换成另一个元音字母 ...

  2. Codeforces Round #702 (Div. 3)解题报告

    Codeforces Round #702 (Div. 3) 全部题解 读错题意,写了半天真是心态爆炸,总的来看这次题目不难的. A. Dense Array http://codeforces.co ...

  3. codeforces A. Jeff and Digits 解题报告

    题目链接:http://codeforces.com/problemset/problem/352/A 题目意思:给定一个只有0或5组成的序列,你要重新编排这个序列(当然你可以不取尽这些数字),使得这 ...

  4. codeforces B. Eight Point Sets 解题报告

    题目链接:http://codeforces.com/problemset/problem/334/B 一开始看到题目,有点怯,理解了题目后,其实并不难.这句话是突破口 three distinct ...

  5. codeforces 450B. Jzzhu and Sequences 解题报告

    题目链接:http://codeforces.com/problemset/problem/450/B 题目意思:给出 f1 和 f2 的值,以及n,根据公式:fi = fi-1 + fi+1,求出f ...

  6. codeforces B. Fox and Cross 解题报告

    题目链接:http://codeforces.com/problemset/problem/389/B 题目意思:给出一个由n行n列组成的board,其中'#'表示的一片地方恰好能画满十字架,画满的意 ...

  7. codeforces 483B Friends and Presents 解题报告

    题目链接:http://codeforces.com/problemset/problem/483/B 题目意思:有两个 friends,需要将 cnt1 个不能整除 x 的数分给第一个friend, ...

  8. codeforces 476B.Dreamoon and WiFi 解题报告

    题目链接:http://codeforces.com/problemset/problem/476/B 题目意思:给出两个字符串str1, str2,其中,str1 只由 '+' 和 '-' 组成,而 ...

  9. codeforces B. The Fibonacci Segment 解题报告

    题目链接:http://codeforces.com/problemset/problem/365/B 题目意思:简单来说,就是要找出最长的斐波纳契长度. 解决的方法不难,但是要注意更新左区间和右区间 ...

最新文章

  1. nginx try_files的理解
  2. 初涉SQL Server性能问题(1/4):服务器概况
  3. C#Winform版获取Excel文件的内容
  4. 修改Docker0网桥默认网段
  5. vue 生命周期详解
  6. 关于Kafka高性能的几个问题
  7. Airflow 中文文档:API 参考
  8. FF官宣新CFO推进融资和产品交付 贾跃亭激动发声
  9. 基于JAVA+SpringBoot+Mybatis+MYSQL的销售团队管理系统
  10. 面试前你需要掌握的二叉树、二叉排序树的创建和四种遍历方式
  11. JavaEE Web 开发 链接 mysql 出现 Class.not found的错误
  12. 使用ffmpeg快速生成视频截图
  13. 用NE5532运算放大器制作降噪耳机
  14. python的scrapy爬虫模块间进行传参_python网络爬虫——scrapy核心组件介绍、请求传参、下载中间件...
  15. Janusgraph使用示例
  16. 金蝶K3提取供应商信息生成在线Web页面供应商信息一览表
  17. mysql int 时间戳转换_MySQL时间戳相互转换
  18. 麻将与扑克的文化内涵
  19. 感悟-关于爱情(一年半,最后一次告别)
  20. 替代满足、稀缺冲动、从众效应、思考快与慢就不怕退货吗?

热门文章

  1. VMware HA实战攻略之五VMwareHA测试验收
  2. golang 简单web服务
  3. 字符串阵列分别输出元素的索引,原值和长度
  4. python requests的安装与简单运用
  5. 都大二下学期了,说说读大学的感受吧
  6. jenkins内置变量的使用
  7. mysql数据库授权
  8. 递归--练习8--noi1788Pell数列
  9. mysql 事务处理
  10. C#: 旋转图片到正确位置