A:做游戏
签到
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ll a,b,c;ll x,y,z;
cin>>a>>b>>c>>x>>y>>z;
cout<<min(a,y)+min(b,z)+min(c,x)<<endl;
}
B:排数字
签到
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=2e5+5;
char a[maxn];
int main()
{
ll n;cin>>n;
ll c1=0,c6=0;
for(ll i=1;i<=n;i++) {
cin>>a[i];if(a[i]-'0'==1) c1++;if(a[i]-'0'==6) c6++;}
if(c6&&c1&&c6>=c1+1) cout<<c1<<endl;
else if(c6&&c1&&c6<=c1) cout<<c6-1<<endl;
else cout<<"0"<<endl;
}
C:算概率
tag:数论,期望dp
Emmm,这题还是有点难搞的,主要是自己第一次接触期望dp,不知道这种取模的含义,这种取模比较另类吧(可能现在还一知半解的),我个人理解是这样字的,比如概率p=a/b,你就用一种类似哈希的思想(纯属口胡,不知道该咋称呼),转换成一个很大的数字q%mod,所以呢(1-p)就可转换成(mod+1-q)%mod了,是一种表示概率的转化思想。弄懂这个了然后再想这个dp问题,状态转移方程,i道题你对了j道的概率就是:
f[i][j]=f[i-1][j]*(1-p[i])+f[i-1][j-1]*p[i];
这个应该很容易懂吧,学过概率论就很清楚
当然啦,我刚刚说过一种类哈希思想的数字转化,p[i]在输入的时候已经转化过了,所以针对1-p[i]你还得亲自操刀转化,p[i]必然大于1的,所以转化应该是(mod+1-p[i])%mod。这样就比较清楚易懂了,这题主要是不知道类哈希转化…呜呜呜
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const ll N=2e3+5;
ll n,p[N],f[N][N];
int main()
{
cin>>n;
for(ll i=1;i<=n;i++) cin>>p[i];
f[0][0]=1;
for(ll i=1;i<=n;i++){
f[i][0]=f[i-1][0]*(mod+1-p[i])%mod;
for(ll j=1;j<=i;j++){
f[i][j]=(f[i-1][j]*(mod+1-p[i])+f[i-1][j-1]*p[i])%mod;
}
}
for(ll i=0;i<=n;i++) cout<<f