题目链接:http://train.usaco.org/usacoprob2?a=bzdILz0bsTb&S=sort3
/* ID: m1590291 TASK: sort3 LANG: C++ */ #include <iostream> #include <fstream> #include <algorithm> using namespace std; /**************************************************************************************************************** 题意:给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。 思路: 一,前后位置不相同的组成N个环,所有环的长度和减去环的个数就是所得解 二,图没有那么熟悉,就用了第二种,也是超NB的一种思路 1,如果两数位置都错了,并且交换后都在正确的位置,这一次交换肯定是必然的 跑一遍 把所有的符合上述条件的数交换回来 每次交换 num++; 2,剩下的就是3个数的位置都是错的,也可以通过两次交换达到正确位置 每次交换 num+=2; 其实可以不用交换,就检查一下在1的位置上有多少个不是1的,乘2即可 ****************************************************************************************************************/ int a[1005],b[1005]; int main() { ifstream fin("sort3.in"); ofstream fout("sort3.out"); int N; while(fin>>N) { for(int i = 0;i < N;i ++){ fin>>a[i]; b[i]=a[i]; } sort(a,a+N); int num=0; int t; for(int i = 0;i < N;i ++){ for(int j = 0;j < N;j ++){ if(i == j) continue; if(b[i] != b[j] && b[i] == a[j] && b[j] == a[i]){ //fout<<"i= "<<i<<" j= "<<j<<endl; //fout<<"b[i]= "<<b[i]<<" b[j]= "<<b[j]<<endl; t=b[j]; b[j]=b[i]; b[i]=t; num++; break; } } } //fout<<num<<endl; for(int i = 0;i < N;i ++) if(a[i] == 1 && b[i] != 1) num+=2; fout<<num<<endl; } return 0; }