#include #include #include #include #include #include #include #include #define MAXN 405 using namespace std; int n,o[MAXN],pos[MAXN],a[MAXN]; int t1,t2; int p[MAXN][MAXN],q[MAXN][MAXN]; double t; ifstream fin("sorting.in"); ofstream fout("sorting.out"); vector > > v; bool sorted () { for (int i=0; ia[i]) return false; return true; } void print(int pos) { fout<>n; for (int i=0; i>o[i]; fin>>t1; for (int i=0; i>p[i][j]; fin>>t2; for (int i=0; i>q[i][j]; fin.close(); } void initFunc () { for (int i=0; i0; i--) if (pos[i]!=i-1) { v[1].push_back(make_pair(pos[i],i-1)); int w1,w2; w1=a[i-1]; w2=a[pos[i]]; swap(a[i-1],a[pos[i]]); ans+=p[i-1][pos[i]]+q[a[i-1]-1][a[pos[i]]-1]; pos[w1]=pos[i]; pos[w2]=i-1; // for (int i=0; ia[i]) break; if (a[j]<=temppos+1) { swap(a[temppos],a[j]); v[2].push_back(make_pair(temppos,j)); ans+=p[temppos][j]+q[a[temppos]-1][a[j]-1]; swap(pos[a[temppos]],pos[a[j]]); if (temppos+1==a[j] || j+1==a[i]) break; temppos=j; } } } return ans; } int checkMin (int *z, int m) { int ans=(1<<31)-1,pos; for (int i=0; i > pq; for (int i=0; i<=n; i++) { d[i]=99999999; pred[i]=-1; } pq.push(make_pair(0,pos0)); d[pos0]=0; while (!pq.empty()) { if ((clock()-t)/CLOCKS_PER_SEC>=2.7) return 0; int num,w; num=pq.top().second; w=-pq.top().first; pq.pop(); if (w>d[num]) continue; for (int i=0; i s; int z=pos; s.push(z); while (pred[z]!=-1) { s.push(pred[z]); z=pred[z]; } int ans=0,tekpos=s.top(); s.pop(); while (!s.empty()) { ans+=p[tekpos][s.top()]+q[a[tekpos]-1][a[s.top()]-1]; swap(a[tekpos],a[s.top()]); v[l].push_back(make_pair(tekpos,s.top())); tekpos=s.top(); s.pop(); } return ans; } int sol5 () ///n^3 { for (int i=0; i0; ii--) { for (int j=0; j q; for (int i=1; i<=n; i++) if (pos[i]!=i-1) q.push_back(i); //cout<<"passed from here\n"; while (!q.empty()) { if ((clock()-t)/CLOCKS_PER_SEC>=2.7) return -1; // for (int j=0; j=2.7) return -1; for (int j=0; j ans; ans.push_back(sol1()); //cout<<"passed "<<1<<'\n'; ans.push_back(sol2()); //cout<<"passed "<<2<<'\n'; ans.push_back(sol3()); //cout<<"passed "<<3<<'\n'; ans.push_back(sol4()); //cout<<"passed "<<4<<'\n'; if ((clock()-t)/CLOCKS_PER_SEC>=2.7) ans.push_back((1<<31)-1); else ans.push_back(sol5()); //cout<<"passed "<<5<<'\n'; if ((clock()-t)/CLOCKS_PER_SEC>=2.7) ans.push_back((1<<31)-1); else ans.push_back(sol6()); int l=7; while (l<100000) { ans.push_back(sol7(l)); l++; if (ans[ans.size()-1]==-1) { l--; break; } } int minAns=(1<<31)-1,minI; for (int i=0; i