(思维分析,贪心)湘大校赛,D.最小的数
2015-04-26 19:58
344 查看
最小的数 | ||
Accepted : 42 | Submit : 255 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB |
题目描述给你一个n位数,每次操作可以选该数任意的相邻两位进行交换,如果最多可以操作k次,那么最终可以得到的最小的数是什么(n位且不能含前导零)? 输入有多组测试数据,第一行为数据个数T(T<=10); 每组数据占一行,包含一个数(不超过1000位)和k(0<=k<=1000),中间用空格隔开;输出最终能得到的最小的数。样例输入2 321654987 1 321654987 2 样例输出231654987 132654987 |
/* 题意:如题。 分析:从最高位到最低位查看,尽可能的将可以取到的最小数“冒泡”到当前最高位。思路也属于一种贪心吧。 注意:当K次“冒泡”的机会没有使用完但处理到最低位时,剩余的机会就不使用了。 */ #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn = 1005; char s[maxn]; int K; int num; bool Find(int h, int l, int r,bool first)//注意最高位不能是“前导0” { bool flag = false; char mark = s[h]; for (int i = l; i <= r; i++) { if (s[i]<s[h] && first?s[i] != '0':true) { if (s[i]<mark) { num = i; mark = s[i]; flag = true; } } } return flag; } void Round(int en, int st) { for (int i = st; i != en; i--) { swap(s[i - 1], s[i]); } } int main() { //freopen("input.txt","r",stdin); int T; scanf("%d", &T); while (T--) { scanf("%s%d", s, &K); int len = strlen(s); int st = 0; bool First = true; for (; K; st++) { if (st == len - 1) break; if (First) { if (Find(st, st + 1, min(st + K, len - 1),true)) { K -= num - st; Round(st, num); } First = false; } else { if (Find(st, st + 1, min(st + K, len - 1),false)) { K -= num - st; Round(st, num); } } } printf("%s\n", s); } return 0; }
相关文章推荐
- (思维分析)湘大校赛,C.Digit
- 暑假训练赛20160727 <贪心,思维,二分图--最小点覆盖>
- Hdu 6178 Monkeys【树形Dp-最小点覆盖+贪心思维】
- SCUT校赛131:小P玩游戏II(贪心 & 思维)
- 贪心方法:最小生成树
- Codeforces Round #436 (Div. 2) D. Make a Permutation! 思维+贪心
- 论可持久化Trie树贪心在区间最大最小值的运用
- 【CodeForces】---Party Lemonade(贪心&&思维&&递归)
- Codeforces 349B Color the Fence【贪心+思维】
- (思维分析)12th浙江省赛,B.Team Formation
- 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)
- POJ1258--贪心&最小生成树的prim算法
- Psytopic分析:您的性格类型是“ISTJ”(内向+实感+思维+判断)
- 贪心思维 专题记录 2017-7-21
- Jungle Roads解题分析(并查集,最小生成树,输入格式)
- 数据分析的五大思维方式
- hdu 4898 LCP+贪心思维
- POJ2349二分+并查集,类似最小树的贪心
- hdu6003 Problem Buyer 贪心 给定n个区间,以及m个数,求从n个区间中任意选k个区间,满足m个数都能在k个区间中找到一个包含它的区间,如果一个区间包含了x,那么 该区间不能再去包含另一个数,即k>=m。求最小的k。如果不存在这样的k,输出“IMPOSSIBLE!”。
- hrbust 1539 选课【思维+贪心】好题