codeforces 435 B. Pasha Maximizes 解题报告
题目链接: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 解题报告相关推荐
- CodeCraft-19 and Codeforces Round #537 (Div. 2)解题报告
Codeforces Round #537 (Div. 2) 题解报告 A. Superhero Transformation 题意 问能否通过把辅音字母换成另一个辅音字母,元音字母换成另一个元音字母 ...
- Codeforces Round #702 (Div. 3)解题报告
Codeforces Round #702 (Div. 3) 全部题解 读错题意,写了半天真是心态爆炸,总的来看这次题目不难的. A. Dense Array http://codeforces.co ...
- codeforces A. Jeff and Digits 解题报告
题目链接:http://codeforces.com/problemset/problem/352/A 题目意思:给定一个只有0或5组成的序列,你要重新编排这个序列(当然你可以不取尽这些数字),使得这 ...
- codeforces B. Eight Point Sets 解题报告
题目链接:http://codeforces.com/problemset/problem/334/B 一开始看到题目,有点怯,理解了题目后,其实并不难.这句话是突破口 three distinct ...
- codeforces 450B. Jzzhu and Sequences 解题报告
题目链接:http://codeforces.com/problemset/problem/450/B 题目意思:给出 f1 和 f2 的值,以及n,根据公式:fi = fi-1 + fi+1,求出f ...
- codeforces B. Fox and Cross 解题报告
题目链接:http://codeforces.com/problemset/problem/389/B 题目意思:给出一个由n行n列组成的board,其中'#'表示的一片地方恰好能画满十字架,画满的意 ...
- codeforces 483B Friends and Presents 解题报告
题目链接:http://codeforces.com/problemset/problem/483/B 题目意思:有两个 friends,需要将 cnt1 个不能整除 x 的数分给第一个friend, ...
- codeforces 476B.Dreamoon and WiFi 解题报告
题目链接:http://codeforces.com/problemset/problem/476/B 题目意思:给出两个字符串str1, str2,其中,str1 只由 '+' 和 '-' 组成,而 ...
- codeforces B. The Fibonacci Segment 解题报告
题目链接:http://codeforces.com/problemset/problem/365/B 题目意思:简单来说,就是要找出最长的斐波纳契长度. 解决的方法不难,但是要注意更新左区间和右区间 ...
最新文章
- nginx try_files的理解
- 初涉SQL Server性能问题(1/4):服务器概况
- C#Winform版获取Excel文件的内容
- 修改Docker0网桥默认网段
- vue 生命周期详解
- 关于Kafka高性能的几个问题
- Airflow 中文文档:API 参考
- FF官宣新CFO推进融资和产品交付 贾跃亭激动发声
- 基于JAVA+SpringBoot+Mybatis+MYSQL的销售团队管理系统
- 面试前你需要掌握的二叉树、二叉排序树的创建和四种遍历方式
- JavaEE Web 开发 链接 mysql 出现 Class.not found的错误
- 使用ffmpeg快速生成视频截图
- 用NE5532运算放大器制作降噪耳机
- python的scrapy爬虫模块间进行传参_python网络爬虫——scrapy核心组件介绍、请求传参、下载中间件...
- Janusgraph使用示例
- 金蝶K3提取供应商信息生成在线Web页面供应商信息一览表
- mysql int 时间戳转换_MySQL时间戳相互转换
- 麻将与扑克的文化内涵
- 感悟-关于爱情(一年半,最后一次告别)
- 替代满足、稀缺冲动、从众效应、思考快与慢就不怕退货吗?