nyoj 1057
2016-02-10 17:27
267 查看
寻找最大数(三)
时间限制:1000 ms | 内存限制:65535 KB难度:2
描述
给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数。
求这个新的整数的最大值是多少。
输入多组测试数据。
每组测试数据占一行,每行有两个数N和K (1 ≤ N≤ 10^18; 0 ≤ K ≤ 100).
输出每组测试数据的输出占一行,输出移动后得到的新的整数的最大值。
样例输入
1990 1 100 0 9090000078001234 6
样例输出
9190 1009907000008001234
解题思路:从高位枚举到低位,假设到第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;
}
相关文章推荐
- 1.一些 贪心算法 的简单思维题:
- 贪心算法——字典序最小问题
- 贪心算法——区间调度问题
- Jump Game I,II 贪心
- Wildcard Matching
- 贪心法实现无向图的划分 代码
- 贪心题目循环和控制台折行
- HDOJ 1009
- 【解题报告】【USACO】酸奶工厂
- 【解题报告】【】交谊舞
- POJ 1328
- Best Cow Line
- HDU 1009 Fatmouse's Trade
- POJ2377 Bad Cowtractors
- 贪心 hdu 1003
- 最大容器
- 满足和为定值的两个数或多个数
- Codeforces Round #300
- HUD1052 __ P2 1002 __ Tian Ji -- The Horse Racing
- 2015年国家集训队测试 BZOJ3816矩阵变幻