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,明显是后面的数比较大。
所以贪心不能乱贪,前提条件就是紧紧地遵循交换次数最多不能超过当前允许的次数。
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- const int maxn = + ;
- char s[maxn];
- int main()
- {
- int k;
- while (cin >> s >> k)
- {
- int len = strlen(s);
- for (int i = ; i < len; i++)
- {
- int t = i; // 讨论第i位的数,后面有没有更大的数可以替代它
- for (int j = i+; j < len && j-i <= k; j++) // j-i <= k就是满足交换次数(实质就是j到i的距离)不能超过剩下最多能交换的次数k
- {
- if (s[j] > s[t])
- t = j; // 找出最大数的下标,前提是不超过k的次数
- }
- k -= (t-i);
- while (t != i) // 代表找到比要讨论的当前最高位要大的数
- {
- swap(s[t], s[t-]); // 不断向前交换
- t--;
- }
- }
- cout << s << endl;
- }
- return ;
- }
codeforces 435 B. Pasha Maximizes 解题报告的更多相关文章
- Codeforces 435 B Pasha Maximizes【贪心】
题意:给出一串数字,给出k次交换,每次交换只能交换相邻的两个数,问最多经过k次交换,能够得到的最大的一串数字 从第一个数字往后找k个位置,找出最大的,往前面交换 有思路,可是没有写出代码来---sad ...
- Codeforces Educational Round 92 赛后解题报告(A-G)
Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...
- codeforces 476C.Dreamoon and Sums 解题报告
题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...
- Codeforces Round #382 (Div. 2) 解题报告
CF一如既往在深夜举行,我也一如既往在周三上午的C++课上进行了virtual participation.这次div2的题目除了E题都水的一塌糊涂,参赛时的E题最后也没有几个参赛者AC,排名又成为了 ...
- codeforces 507B. Amr and Pins 解题报告
题目链接:http://codeforces.com/problemset/problem/507/B 题目意思:给出圆的半径,以及圆心坐标和最终圆心要到达的坐标位置.问最少步数是多少.移动见下图.( ...
- codeforces 500B.New Year Permutation 解题报告
题目链接:http://codeforces.com/problemset/problem/500/B 题目意思:给出一个含有 n 个数的排列:p1, p2, ..., pn-1, pn.紧接着是一个 ...
- codeforces B. Xenia and Ringroad 解题报告
题目链接:http://codeforces.com/problemset/problem/339/B 题目理解不难,这句是解题的关键 In order to complete the i-th ta ...
- codeforces 462C Appleman and Toastman 解题报告
题目链接:http://codeforces.com/problemset/problem/461/A 题目意思:给出一群由 n 个数组成的集合你,依次循环执行两种操作: (1)每次Toastman得 ...
- codeforces 460A Vasya and Socks 解题报告
题目链接:http://codeforces.com/problemset/problem/460/A 题目意思:有一个人有 n 对袜子,每天早上会穿一对,然后当天的晚上就会扔掉,不过他会在 m 的倍 ...
随机推荐
- 438. Find All Anagrams in a Strin
Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. Strings ...
- Mac OS X 下安装python的MySQLdb模块
参考资料: mac os x下python安装MySQLdb模块 http://www.codeif.com/post/1073/ MAC OSX使用Python安装模块有关问题 http:// ...
- Windows下使用Nexus搭建Maven私服(安装)
一.下载Nexus 下载OSS最新版:https://www.sonatype.com/download-oss-sonatype 老版本:https://support.sonatype.com/h ...
- Linux内核配置选项
http://blog.csdn.net/wdsfup/article/details/52302142 http://www.manew.com/blog-166674-12962.html Gen ...
- 实现uitable cell中点击button设置当前cell为选中状态
- (void)buttonClick:(id)senser{ NSInteger tag = [senser tag]; NSLog(@"the button tag is % ...
- How to Install a Language Pack
https://www.phpbb.com/kb/article/how-to-install-a-language-pack
- 单点登录CAS-Demo
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 1安全证书配置 2部署服务端CAS-Server 3部署CAS-Client 4测试SSO 1,安全证书配置 CAS默认 ...
- Mysql学习记录点
order by 数字,表示按照第几列来排序,可以从1开始,不能是0,也不能超过列数.
- Python基础语法08--MySql应用
python操作mysql数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. DB-API 是一个规范. 它定义了一系列 ...
- linux 源码编译安装apache
cc1 是c语言的编译器.