[关闭]
@994495jj 2017-06-02T12:56:09.000000Z 字数 2966 阅读 899

hanabi组队训练1

201706 (ACM)hanabi组队训练 (ACM)构造 (ACM)思维 (ACM)动态规划



题目链接


训练总结


补题

B. Beer Pressure(dp/滚动数组)

题意

题解

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. double dp1[55][55][55][55];
  6. double dp2[55][55][55][55];
  7. double ans[5];
  8. int _[5];
  9. int main() {
  10. int n,k;
  11. while(~scanf("%d%d",&n,&k)) {
  12. ///init
  13. memset(dp1,0,sizeof(dp1));
  14. memset(dp2,0,sizeof(dp2));
  15. memset(ans,0,sizeof(ans));
  16. memset(_,0,sizeof(_));
  17. ///read
  18. int s=0;
  19. for(int i=0;i<n;++i) {
  20. scanf("%d",_+i);
  21. s=s+_[i];
  22. }
  23. ///solve
  24. dp1[_[0]][_[1]][_[2]][_[3]]=1;
  25. for(int i=s;i<k;++i) {//更新i+1
  26. for(int a=_[0];a+_[4]<=i;++a) {
  27. for(int b=_[1];a+b+_[4]<=i;++b) {
  28. for(int c=_[2];a+b+c+_[4]<=i;++c) {
  29. for(int d=_[3];a+b+c+d+_[4]<=i;++d) {
  30. dp2[a+1][b][c][d]+=dp1[a][b][c][d]*a/i;
  31. dp2[a][b+1][c][d]+=dp1[a][b][c][d]*b/i;
  32. dp2[a][b][c+1][d]+=dp1[a][b][c][d]*c/i;
  33. dp2[a][b][c][d+1]+=dp1[a][b][c][d]*d/i;
  34. dp2[a][b][c][d]+=dp1[a][b][c][d]*(i-a-b-c-d)/i;
  35. } } } }
  36. for(int a=_[0];a+_[4]<=i+1;++a) {
  37. for(int b=_[1];a+b+_[4]<=i+1;++b) {
  38. for(int c=_[2];a+b+c+_[4]<=i+1;++c) {
  39. for(int d=_[3];a+b+c+d+_[4]<=i+1;++d) {
  40. dp1[a][b][c][d]=dp2[a][b][c][d];
  41. dp2[a][b][c][d]=0;
  42. } } } }
  43. }
  44. for(int a=_[0];a+_[4]<=k;++a) {
  45. for(int b=_[1];a+b+_[4]<=k;++b) {
  46. for(int c=_[2];a+b+c+_[4]<=k;++c) {
  47. for(int d=_[3];a+b+c+d+_[4]<=k;++d) {
  48. int e=k-a-b-c-d;
  49. int Max=max(a,max(b,max(c,max(d,e))));
  50. int cnt=0;
  51. if(Max==a) ++cnt;
  52. if(Max==b) ++cnt;
  53. if(Max==c) ++cnt;
  54. if(Max==d) ++cnt;
  55. if(Max==e) ++cnt;
  56. if(Max==a) ans[0]=ans[0]+dp1[a][b][c][d]/cnt;
  57. if(Max==b) ans[1]=ans[1]+dp1[a][b][c][d]/cnt;
  58. if(Max==c) ans[2]=ans[2]+dp1[a][b][c][d]/cnt;
  59. if(Max==d) ans[3]=ans[3]+dp1[a][b][c][d]/cnt;
  60. if(Max==e) ans[4]=ans[4]+dp1[a][b][c][d]/cnt;
  61. } } } }
  62. for(int i=0;i<n;++i) printf("pub %d: %.2f %\n",i+1,ans[i]*100);
  63. }
  64. return 0;
  65. }

F. Foul Play(构造/思维)

题意

题解

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<vector>
  4. #include<algorithm>
  5. #include<iostream>
  6. using namespace std;
  7. #define de(x) cout<<#x<<" = "<<x<<endl;
  8. const int N=1100;
  9. char s[N][N];
  10. bool del[N],vis[N];
  11. vector<int> tt;
  12. int n;
  13. void print(int x,int y) {
  14. printf("%d %d\n",x+1,y+1);
  15. vis[x]=vis[y]=0;
  16. if(s[x][y]=='1') del[y]=1;
  17. else del[x]=1;
  18. }
  19. void dfs(int x) {
  20. if(x==1) return ;
  21. ///init
  22. tt.clear();
  23. memset(vis,0,sizeof(vis));
  24. ///set vis
  25. for(int i=0;i<n;++i) {
  26. if(!del[i]) vis[i]=1;
  27. }
  28. ///t1 & t0
  29. for(int i=0;i<n;++i) {
  30. if(!vis[i]||s[i][0]=='0') continue;
  31. bool f=1;
  32. for(int j=0;j<n;++j) {
  33. if(!vis[j]||s[j][i]=='0'||s[j][0]=='1') continue;
  34. print(i,j);
  35. f=0;
  36. break;
  37. }
  38. if(f) tt.push_back(i);
  39. }
  40. ///t0 & t0
  41. int sz=tt.size();
  42. for(int i=0;i+1<sz;i+=2) print(tt[i],tt[i+1]);
  43. ///1 & X
  44. for(int i=1;i<n;++i) {
  45. if(vis[i]&&s[0][i]=='1') {
  46. print(0,i);
  47. break;
  48. }
  49. }
  50. ///X & X
  51. int cnt=1,pre=0;
  52. for(int i=0;i<n;++i) {
  53. if(vis[i]) {
  54. ++cnt;
  55. if(cnt&1) print(pre,i);
  56. pre=i;
  57. }
  58. }
  59. ///
  60. dfs(x/2);
  61. }
  62. int main() {
  63. while(~scanf("%d",&n)) {
  64. ///init
  65. memset(del,0,sizeof(del));
  66. ///read
  67. for(int i=0;i<n;++i) scanf("%s",s[i]);
  68. ///solve
  69. dfs(n);
  70. }
  71. return 0;
  72. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注