明天出发去金华,今天抓了场topcoder练练手,结果发现这场比赛的题目貌似还比较适合练手,……orz……
A.水题,分底下一块是红色还是蓝色讨论,然后枚举一遍最后map搞过。
class TheBrickTowerEasyDivTwo { public: map<int,int> m; int find(int redCount, int redHeight, int blueCount, int blueHeight) { int tmp,s=0,x=redCount,y=blueCount; tmp=0; while(1) { if (tmp==0 && x>0) { x--; tmp=1; s+=redHeight; m[s]=1; } else if(tmp==1 && y>0) { y--; tmp=0; s+=blueHeight; m[s]=1; } else break; } s=0; tmp=0; x=redCount; y=blueCount; printf("%d\n",m.size()); while(1) { if (tmp==1 && x>0) { x--; tmp=!tmp; s+=redHeight; m[s]=1; } else if (tmp==0 && y>0) { y--; tmp=!tmp; s+=blueHeight; m[s]=1; } else break; } return m.size(); } };
class TheBrickTowerMediumDivTwo { public: vector<int> ans,ret; int vis[10]; int tmp; void DFS(int t,int n,vector<int> height) { int i,j,s=0; if (t==n) { for (i=0;i<n-1;i++) { s+=max(height[ans[i]],height[ans[i+1]]); } if (s<tmp) { ret=ans; tmp=s; } return; } for (i=0;i<n;i++) { if (vis[i]==0) { vis[i]=1; ans.push_back(i); DFS(t+1,n,height); vis[i]=0; ans.pop_back(); } } } vector<int> find(vector<int> heights) { int n=heights.size(); memset(vis,0,sizeof(vis)); tmp=100000000; DFS(0,n,heights); return ret; } };
class TheBrickTowerHardDivTwo { public: long long dp[50][(1<<8)+5][50]; vector<int> a[(1<<8)+5]; int cnt[(1<<8)+5]; int Count(int x,int y,int C) { int i,cnt=0; for (i=0;i<4;i++) { if (a[x][i]==a[y][i]) cnt++; } return cnt; } bool Check(int t,int C) { int i; for (i=0;i<4;i++) { if (a[t][i]>=C) return false; } return true; } int find(int C, int K, int H) { int i,j,n,p,tmp,k,l; long long s=0; memset(cnt,0,sizeof(cnt)); memset(dp,0,sizeof(dp)); for (i=0;i<(1<<8);i++) { p=i; for (j=0;j<4;j++) { tmp=p%4; a[i].push_back(tmp); p=p>>2; } for (j=1;j<4;j++) { if (a[i][j]==a[i][j-1]) cnt[i]++; } if (a[i][3]==a[i][0]) cnt[i]++; if (Check(i,C)==true) dp[1][i][cnt[i]]++; } for (i=1;i<H;i++) { for (j=0;j<(1<<8);j++) { if (Check(j,C)==false) continue; for (k=0;k<=K;k++) { for (l=0;l<(1<<8);l++) { if (Check(l,C)==false) continue; dp[i+1][l][k+Count(j,l,C)+cnt[l]]=(dp[i+1][l][k+cnt[l]+Count(j,l,C)]+dp[i][j][k])%MOD; } } } } for (i=1;i<=H;i++) { for (j=0;j<(1<<8);j++) { if (Check(j,C)==false) continue; for (k=0;k<=K;k++) { s=(s+dp[i][j][k])%MOD; } } } return s; } };