#include #include #include #include using namespace std; #define N 10 int n; struct S { int vs[N][2]; }; int operator<(const S& a, const S& b) { for (int i=0;ibv_min) return 0; if (av_maxbv_max) return 0; } return 0; } map memo; void dump(S& cur) { puts(""); for (int i=0;icur.vs[i2][j2]) { res+=2; } } for (int i=st;ii||cur.vs[j][1]>i) ok=0; if (!ok) res+=2; } } return (res+5)/6; } int get_lb2(S& cur, int st, int en) { int res=0; for (int i=st;i& log) { int st=0,en=n; while(st=0&&cur.vs[en-1][0]==en-1&&cur.vs[en-1][1]==en-1) --en; if (st>=en) return 1; int lb=cnt+max(get_lb1(cur,st,en),get_lb2(cur,st,en)); if (lb>ub) return 0; map::iterator it=memo.find(cur); if (it!=memo.end()&&it->second<=cnt) return 0; memo[cur]=cnt; for (int i=st;icur.vs[i+1][1-j2]) continue; if (cur.vs[i][j1]<=cur.vs[i+1][j2]) continue; swap(cur.vs[i][j1],cur.vs[i+1][j2]); log.push_back(cur); if (solve(cur,cnt+1,ub,log)) return 1; log.pop_back(); swap(cur.vs[i][j1],cur.vs[i+1][j2]); } } } return 0; } int main() { scanf("%d",&n); S start; for (int i=0;i log; log.push_back(start); while(1) { memo.clear(); if (solve(start,0,ans,log)) break; ++ans; } printf("%d\n",ans); }