Time Limit: 1000 ms Memory Limit: 64 MB
Total Submission: 158 Submission Accepted: 31
Total Submission: 158 Submission Accepted: 31
Description
有一天,天上掉馅饼了。不过不是直接掉馅饼,是告诉你你将要得到的馅饼的数量a。聪明的你得到了一种魔法,可以在整数a中交换任意两个相邻的数字。而这种魔法,你最多只能使用k次。你使用魔法操作a,得到的最大的结果就是你最终获得的馅饼数量。
你最多可以获得的馅饼数量是多少呢?
你最多可以获得的馅饼数量是多少呢?
Input
第一行,一个数字n(1<=n<=60)。代表测试数据数量。
接下来n行,每行两个整数a和k(1<=a<=1,000,000,000; 0<=k<=100)。
接下来n行,每行两个整数a和k(1<=a<=1,000,000,000; 0<=k<=100)。
Output
输出n行,每行一个整数,代表你最多使用魔法k次,可以得到的最大的数字。
Sample Input
Original | Transformed |
2 1990 1 1034 2
2[EOL] 1990[SP]1[EOL] 1034[SP]2[EOF]
Sample Output
Original | Transformed |
9190 3104
其实这题还是挺简单的,比赛时没认真想,补题的时候理清思路就写出来了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<string>
#include<vector>
#include<ctime>
#include<map>
#include<set>
#include<bitset>
//#define DEBUG
using namespace std;
const int maxn = 1000005;
void swap(int * a,int *b);
int main(){
cin.tie(0);
cin.sync_with_stdio(false);
#ifdef DEBUG
int START = clock();
freopen("Text.txt","r",stdin);
#endif
int n;
cin>>n;
while(n--){
int a,k;
int b[15],c[15];
char s[15];
int i,j;
cin>>s>>k;
a=strlen(s);
if(a==1){
cout<<s<<endl;
continue;
}
for(i=0;i<a;i++){
b[i]=s[i]-'0';
c[i]=b[i];
}
int maxnum,maxpos;
for(i=0;i<a;i++){
if(k<=0){
break;
}
maxnum=b[i];
bool flag=false;;
for(j=i+1;j<a&&k>=j-i;j++){
if(b[j]>maxnum){
maxnum=b[j];
maxpos=j;
flag=true;
}
}
if(flag){
for(int k=maxpos;k>i;k--)
swap(&b[k],&b[k-1]);
k=k-(maxpos-i);
}
}
for(i=0;i<a;i++)
cout<<b[i];
cout<<endl;
}
#ifdef DEBUG
printf("Time:%.3lf\n",(double)(clock() - START) / CLOCKS_PER_SEC);
#endif
return 0;
}
void swap(int * a,int *b){
int temp=*a;
*a=*b;
*b=temp;
}