一直出错,一直到在讨论区看到“贪心移动”;
寻找最大数(三)
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数。
求这个新的整数的最大值是多少。
正确代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define SIZE 15
int main()
{
int k,i,j;
char a[100];
memset(a,0x00,sizeof(a));
while(scanf("%s%d",a,&k)!=EOF)
{
int k1=k;
int len=strlen(a);
for( i=0; i<len; i++)
{
char maxx=a[i];
int num=i;
int endy=i+k1+1;
if(endy>len)
endy=len;
for(j=i+1; j<endy; j++)
{
if(a[j]>maxx)
{
maxx=a[j];
num=j;
}
}
for(int p=num;p>i;p--) //贪心移动;
{
int temp=a[p];
a[p]=a[p-1];
a[p-1]=temp;
}
k1=k1-(num-i-1)-1;
// printf("%d %d %d\n",i,num,k1);
// if(k1<=0)
// break;
}
printf("%s\n",a);
memset(a,0x00,sizeof(a));
}
return 0;
}
注意“贪心移动”;
对比nyoj915 ‘+’‘-’字符串
代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define SIZE 10000
char s1[SIZE],s2[SIZE];
int main()
{
while(scanf("%s%s",s1,s2)!=EOF)
{
int len=strlen(s1);
int toco=0;
for(int i=0; i<len; i++)
{
if(s1[i]!=s2[i])
{
char ch;
ch=s2[i];
for(int j=i+1; j<len; j++)
{
toco++;
if(s1[j]==ch)
{
s1[j]=s1[i];
s1[i]=ch;
break;
}
}
}
}
printf("%d\n",toco);
memset(s1,0x00,sizeof(s1));
memset(s2,0x00,sizeof(s2));
}
return 0;
}
无需“贪心移动”;