By
yusijia
Updated:
## 题目大意:
给一个数,一个k,k次交换(只能相邻交换)后使这个数最大
分析:
设一个指针指向起点,然后另一个指针从起点往后走k步找比起点里的值大的最大值插入到起点的前面,
这里由于题目数据小,直接让数组整体后移来实现插入就ok了,另一个思路:如果数据大的话,用双向
链表来实现插入删除会快些
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std;
const int MAXN = 1017;
char str[MAXN];
void solve(int k) { int flag = -1, maxs; int len = strlen(str); for(int i = 0; i < len; i++)if(k){ flag = -1; maxs = str[i]; for(int j = i; j <= i + k && j < len; j++){ if(str[j] > maxs){ maxs = str[j]; flag = j; } } if(flag != -1){ int tmp = str[flag]; for(int index = flag; index > i; index--) str[index] = str[index - 1]; str[i] = tmp; k = k - (flag - i); } } printf("%s\n", str); }
int main() { int T, k = 0; scanf("%d", &T); while(T--){ scanf("%d", &k); scanf("%s", str); solve(k); } return 0; }
|