Spinning Table
#include <bits/stdc++.h> #define N 300000 using namespace std; int n; int pi[3]; int cn[3][100+5]; int dp[100+5][100+5][100+5][3]; int res; void input(){ //freopen("in.txt","r",stdin); cin>>n; for(int i=0;i<3;i++){ cin>>pi[i]; for(int j=1;j<=pi[i];j++){ cin>>cn[i][j]; cn[i][j]--; } cn[1][0]=n/3; cn[2][0]=2*(n/3); } memset(dp,-1,sizeof dp); } int rev(int a,int b){ int diff=abs(a-b); diff%=n; return min(diff,n-diff); } int pro(int i,int j,int k,int idx){ //cout<<i<<" "<<j<<" "<<k<<" "<<idx<<endl; int &ans=dp[i][j][k][idx]; if(ans!=-1){ return ans; } if(i>pi[0]+1||j>pi[1]+1||k>pi[2]+1){ //cout<<" "<<i<<" "<<j<<" "<<k<<" "<<idx<<endl; return ans=1e9; } if(i==pi[0]+1&&j==pi[1]+1&&k==pi[2]+1){ return ans=0; } int p; if(idx==0){ p=cn[0][i-1]; }else if(idx==1){ p=cn[1][j-1]+2*(n/3); }else{ p=cn[2][k-1]+n/3; } ans=1e9+5; ans=min(ans,pro(i+1,j,k,0)+rev(p,cn[0][i])); ans=min(ans,pro(i,j+1,k,1)+rev(p,cn[1][j]+2*(n/3))); ans=min(ans,pro(i,j,k+1,2)+rev(p,cn[2][k]+n/3)); return ans; } int main() { input(); res=pro(1,1,1,0); cout<<res<<endl; return 0; }
Comments
Post a Comment