题意是给你N个有1,2,3组成的数列,问你最少交换几次可以使数列升序,
我想在1位段上的2就优先从2位段上找个1交换,2位段上没有就从3位段上找,这样先把1位段都填满1,
同理2位段进行交换,我就是这么随便想想,完全无法证明算法的正确性,结果AC了.........
code:
/* ID: yueqiq LANG: C++ TASK: sort3 */ #include <set> #include <map> #include <ctime> #include <queue> #include <cmath> #include <stack> #include <limits> #include <vector> #include <bitset> #include <string> #include <cstdio> #include <cstring> #include <fstream> #include <string.h> #include <iostream> #include <algorithm> #define ls rt<<1 #define rs rt<<1|1 #define Si set<int> #define LL long long #define pb push_back #define PS printf(" ") #define Vi vector<int> #define LN printf("\n") #define SD(a) scanf("%d",&a) #define PD(a) printf("%d",a) #define SET(a,b) memset(a,b,sizeof(a)) #define FF(i,a) for(int i(0);i<(a);i++) #define FD(i,a) for(int i(a);i>=(1);i--) #define FOR(i,a,b) for(int i(a);i<=(b);i++) #define FOD(i,a,b) for(int i(a);i>=(b);i--) #define readf freopen("sort3.in","r",stdin) #define writef freopen("sort3.out","w",stdout) const double pi = acos(-1.0); const int maxn = 50; const int BigP = 99999999; const int INF = 99999999; const int dx[]={0,1,0,-1}; const int dy[]={1,0,-1,0}; using namespace std; int N,ans,cnt1,cnt2,cnt3; int a[1005]; void swap(int i,int j){ ans++; int t=a[i]; a[i]=a[j]; a[j]=t; } int main(){ readf; writef; SD(N); FOR(i,1,N){ SD(a[i]); if(a[i]==1) cnt1++; if(a[i]==2) cnt2++; if(a[i]==3) cnt3++; } FOR(i,1,cnt1){ if(a[i]==2){ FOR(j,cnt1+1,N){ if(a[j]==1){ swap(i,j); break; } } } if(a[i]==3){ FOD(j,N,cnt1+1){ if(a[j]==1){ swap(i,j); break; } } } } // FOR(i,1,N){ // PD(a[i]);PS; // } // LN; FOR(i,cnt1+1,cnt1+cnt2){ if(a[i]==3){ FOD(j,N,cnt1+cnt2+1){ if(a[j]==2){ swap(i,j); break; } } } } // FOR(i,1,N){ // PD(a[i]);PS; // } // LN; PD(ans);LN; return 0; }