//usaco training-Sorting a Three-Valued Sequence /* * 题意:写一个程序计算出,给定的一个1,2,3组成的数字序列 * 排成升序所需的最少交换次数 * 题目数据:2 2 1 3 3 3 2 3 1 * sort后: 1 1 2 2 2 3 3 3 3 * 第 1和3,4和7组数据可直接通过一次交换达到 * 2 1 2 2 3 3 3 3 1 * 1 1 2 2 2 3 3 3 3 * 剩下两种情况 2 3 1 和 3 1 2 只能通过两次交换达到 * 1 2 3 1 2 3 */ /* Compiling... Compile: OK Executing... Test 1: TEST OK [0.000 secs, 3028 KB] Test 2: TEST OK [0.000 secs, 3028 KB] Test 3: TEST OK [0.000 secs, 3028 KB] Test 4: TEST OK [0.000 secs, 3028 KB] Test 5: TEST OK [0.000 secs, 3028 KB] Test 6: TEST OK [0.000 secs, 3028 KB] Test 7: TEST OK [0.000 secs, 3028 KB] Test 8: TEST OK [0.000 secs, 3028 KB] All tests OK. YOUR PROGRAM ('sort3') WORKED FIRST TIME! That's fantastic -- and a rare thing. Please accept these special automated congratulations. */ #include <iostream> #include <fstream> using namespace std; #define MAX 1010 int minnum,n1,n2,n3,n1_2,n1_3,n2_1,n2_3,n3_1,n3_2; int a[MAX]; int main(void) { int n,i; ifstream fin("sort3.in"); ofstream fout("sort3.out"); fin>>n; for(i=0; i!=n; ++i){ fin>>a[i]; if(a[i]==1) n1++; else if(a[i]==2) n2++; else n3++; } for(i=0; i!=n1; ++i){ if(a[i]==2) n1_2++; else if(a[i]==3) n1_3++; } for(i=n1; i!=n1+n2; ++i){ if(a[i]==1) n2_1++; else if(a[i]==3) n2_3++; } for(i=n1+n2; i!=n; ++i){ if(a[i]==1) n3_1++; else if(a[i]==2) n3_2++; } minnum=min(n1_2,n2_1)+min(n1_3,n3_1)+min(n2_3,n3_2); minnum+=2*(n1_2-min(n1_2,n2_1)+n1_3-min(n1_3,n3_1)); fout<<minnum<<endl; return 0; }