2020牛客寒假算法基础集训营2 题解报告

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值