nyoj 1057

来源:互联网 发布:淘宝第三层级交易额 编辑:程序博客网 时间:2024/06/14 04:28

寻找最大数(三)

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述

给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数。

求这个新的整数的最大值是多少。

输入
多组测试数据。
每组测试数据占一行,每行有两个数N和K (1 ≤ N≤ 10^18; 0 ≤ K ≤ 100).
输出
每组测试数据的输出占一行,输出移动后得到的新的整数的最大值。
样例输入
1990 1100 09090000078001234 6
样例输出
9190100

9907000008001234


解题思路:从高位枚举到低位,假设到第i位,那么就要从i+1位找最大的数并且能够交换到第i位。。贪心思想。。

一直WA。。。还在找原因


#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct node{char num;int id;}digit[20];int n,k;char str[20];bool vis[20];bool cmp(node a,node b){if(a.num != b.num)return a.num > b.num;return a.id < b.id;}void swap(char *str,int l,int r){char t = str[r];for(int i = r-1; i >= l; i--)str[i+1] = str[i];str[l] = t;}int main(){while(scanf("%s %d",str,&k)!=EOF){getchar();n = strlen(str);for(int i = 0; i < n; i++){digit[i].id = i;digit[i].num = str[i];}sort(digit,digit+n,cmp);memset(vis,false,sizeof(vis));for(int i = 0; i < n; i++) //从高位到低位尽可能找到最大的for(int j = 0; j < n; j++){int id = digit[j].id;if(id == i || vis[id]) {if(vis[id] == true) continue;vis[id] = true;break;}if(id - i <= k && id > i && str[i] < str[id]){k -= id - i;vis[id] = true;swap(str,i,id);break;}}printf("%s\n",str);}return 0;}


0 0
原创粉丝点击