您的位置:首页 > 其它

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
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  贪心