[关闭]
@Venous 2018-02-26T15:57:05.000000Z 字数 885 阅读 1021

2018.2.26 国家集训队选拔考试

考试


1.彩色圆环

BZOJ 2201(别试了,权限题) 清橙A1202
O(N^2)戳我有题解

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. const int _=205;
  6. inline int read()
  7. {
  8. char ch='!';int z=1,num=0;
  9. while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
  10. if(ch=='-')z=-1,ch=getchar();
  11. while(ch<='9'&&ch>='0')num=(num<<3)+(num<<1)+ch-'0',ch=getchar();
  12. return z*num;
  13. }
  14. int N,M;
  15. long double ans,g[_],dp[_][2];
  16. //dp[i][1/0]表示长度为i的序列,第一个和第二个球颜色不同,第一个和最后一个颜色相同/不同的期望美观程度
  17. int main()
  18. {
  19. //freopen("circle.in","r",stdin);
  20. //freopen("circle.out","w",stdout);
  21. N=read();M=read();
  22. g[1]=1;dp[1][1]=1;
  23. for(int i=2;i<=N;i++)g[i]=1.0*g[i-1]/M;
  24. ans+=g[N]*N;
  25. for(int i=2;i<=N;i++)
  26. {
  27. for(int j=1;j<i;j++)//枚举序列长度1-i转移
  28. {
  29. dp[i][0]+=dp[i-j][0]*(1-2.00/M)*j*g[j]+1.0*dp[i-j][1]*(1-1.0/M)*j*g[j];
  30. dp[i][1]+=dp[i-j][0]*j/(double)M*g[j];
  31. }
  32. }
  33. for(int i=1;i<N;i++)ans+=i*i*dp[N-i+1][0]*g[i];//枚举上半环长度
  34. //只能枚举dp[][0],因为第一段和N-i段必须是不一样的
  35. printf("%.8Lf\n",ans);
  36. return 0;
  37. }

2.剪枝

清橙A1212

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注