LOADING

加载过慢请开启缓存,浏览器默认开启

daily 2

2023/5/12 daily

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;
}