首页 > 代码库 > CodeForces 489A (瞎搞) SwapSort
CodeForces 489A (瞎搞) SwapSort
题意:
给n个整数(可能有重复),输出一个不超过n次交换的方案,使得经过这n次交换后,整个序列正好是非递减的。
分析:
首先说题解给的算法。
从左到右扫一遍,交换第i个数和它后面最小的那个数。
代码看起来大概是这个样子的:
1 for (int i = 0; i < n; i++) 2 { 3 int j = i; 4 for (int t = i; t < n; t++) 5 if (a[j] > a[t]) 6 j = t; 7 if (i != j) 8 answer.push_back(make_pair(i, j)); 9 swap(a[i], a[j]);10 }
当时看到这题一直没有明确的思路,于是开始乱搞。 =_=||
首先排了下序,然后从左到右逐个对比原序列和排序后的序列,如果有不一样的,就从原序列的后面把这个“正确”的数找出来交换,直到两个序列完全相同。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6 7 const int maxn = 3000 + 10; 8 int a[maxn], b[maxn], ans[maxn][2]; 9 10 int main()11 {12 int n;13 while(scanf("%d", &n) == 1 && n){14 for(int i = 0; i < n; ++i)15 {16 scanf("%d", &a[i]);17 b[i] = a[i];18 }19 sort(b, b + n);20 21 int cnt = 0;22 bool flag; //标记是否发生过交换23 while(1)24 {25 flag = false;26 for(int i = 0; i < n; ++i)27 {28 if(a[i] != b[i])29 {30 flag = true;31 for(int j = n-1; j >= 0; --j)32 if(a[j] == b[i] && i != j)33 {34 swap(a[i], a[j]);35 ans[cnt][0] = i;36 ans[cnt++][1] = j;37 break;38 }39 }40 }41 if(!flag) break;42 }43 printf("%d\n", cnt);44 for(int i = 0; i < cnt; ++i) printf("%d %d\n", ans[i][0], ans[i][1]);45 }46 47 return 0;48 }
CodeForces 489A (瞎搞) SwapSort
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。