2018-02-26考试

今天考试,李老师说题目有点难度,结果…
果……果……果然是有难度20分收场

结果

题目

T1

T1

T2

T2

代码 + 题解

T1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*************************************
* 彩色圆环 By xgzc. *
* 状态:AC *
* 极难题 *
*************************************


*先考虑序列
*设f[i][0/1]表示前i个珠子,最后1个珠子和第1个珠子颜色不同(相同)的期望值
*设g[i]表示i个珠子连续1个颜色的概率
*f[i][0]=∑(i-j)*g[i-j]*(f[j][0]*(m-2)/m+f[j][1]*(m-1)/m);
*f[i][1]=∑(i-j)*g[i-j]*f[j][0]/m;
*初始 f[0][1]=1;
*然后处理环形
*首先将g[n]*n累加进答案
*我们可以枚举第一段有多长.如果长度为x,那么就可以有x个位置
*所以对于每个x,将x*x*f[n-x][0]*g[x]累加进答案
*时间复杂度 O(n^2)
*/
#include<bits/stdc++.h>
#define RG register
#define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);
#define clear(x, y) memset(x, y, sizeof(x));
using namespace std;

inline int read()
{
int data=0, w=1;
char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') w=-1, ch=getchar();
while(ch>='0'&&ch<='9') data=(data<<3)+(data<<1)+(ch^48), ch=getchar();
return data*w;
}

const int maxn(210);
int n;
long double ans, f[maxn][2], g[maxn], m;

int main()
{
n=read(); m=read();
g[1]=f[0][1]=1.0000;
for(RG int i=2;i<=n;i++) g[i]=g[i-1]/m;
for(RG int i=0;i<n;i++)
for(RG int j=i+1;j<=n;j++)
{
f[j][0]+=(j-i)*g[j-i]*(f[i][0]*(m-2.0000)/m+f[i][1]*(m-1.0000)/m);
f[j][1]+=(j-i)*g[j-i]*f[i][0]/m;
}
ans=g[n]*n;
for(RG int i=1;i<n;i++) ans+=1.0000*i*i*f[n-i][0]*g[i];
printf("%.10Lf\n", ans);
return 0;
}

T2

(还没做)

总结

没什么好总结的

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×