CF 540D
简单概率dp,我们可以写出转移方程
${dp[i][j][k]+=dp[i][j+1][k](j+1)i/((j+1)k+(j+1)i+i*k)}$
注意只有剪子>0的时候才能剪布
void solve(){
int r,s,p;
cin>>r>>s>>p;
dp[r][s][p]=1.0;
for(int i=r;i>=0;--i){
for(int j=s;j>=0;--j){
for(int k=p;k>=0;--k){
if(i){// kill sissor
dp[i][j][k]+=dp[i][j+1][k]*(j+1)*i/((j+1)*k+(j+1)*i+i*k);
}
if(j){//kill paper
dp[i][j][k]+=dp[i][j][k+1]*(k+1)*j/((k+1)*i+(k+1)*j+j*i);
}
if(k){//kill rock
dp[i][j][k]+=dp[i+1][j][k]*(i+1)*k/((i+1)*j+(i+1)*k+j*k);
}
}
}
}
double ans1=0,ans2=0,ans3=0;
for(int i=1;i<=r;++i)ans1+=dp[i][0][0];
for(int i=1;i<=s;++i)ans2+=dp[0][i][0];
for(int i=1;i<=p;++i)ans3+=dp[0][0][i];
cout.precision(11);
cout<<ans1<<' '<<ans2<<' '<<ans3<<'\n';
return;
}
CF 535E
因为只能typo一次,所以最多两个位置不一样,那就慢慢找就ok了
void solve(){
int n;cin>>n;
string s,t;
cin>>s>>t;
s=')'+s;
t='('+t;
int l=n+1,r=-1;
for(int i=1;i<=n;++i){
if(s[i]!=t[i]){
l=min(l,i);
r=max(r,i);
}
}
int ans1=1,ans2=1;
for(int i=l+1;i<=r;++i){
if(s[i]!=t[i-1]){
ans2=0;
}
if(t[i]!=s[i-1]){
ans1=0;
}
}
cout<<ans1+ans2<<'\n';
return;
}