nyoj 1057

寻找最大数(三)

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

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

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

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

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;
}


你可能感兴趣的:(贪心)