ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

YbtOJ 「数学基础」第6章 期望问题

2022-08-31 01:01:23  阅读:188  来源: 互联网

标签:code 期望 int YbtOJ d% 数学 ans const main


既然被提醒了不要咕咕咕那就先写一点(?
不过过几天估计就又咕啦。
深刻体会到了写完几道题统一补博客的难受。
期望题 LaTeX 好难打诶可能写得简略点qaq

例题1.单选错位

emmm 好像没啥可说(?

code
#include<bits/stdc++.h>
using namespace std; 
const int N=1e7+5;
int n,A,B,C,a[N];
double ans;
int main()
{
	scanf("%d%d%d%d%d", &n, &A, &B, &C, a + 1);
	for (int i = 2; i <= n; i++)
		a[i] = ((long long) a[i - 1] * A + B) % 100000001;
	for (int i = 1; i <= n; i++)
		a[i] = a[i] % C + 1;
	ans+=1.0/max(a[1],a[n]);
	for(int i=2;i<=n;i++)
	{
		ans+=1.0/max(a[i],a[i-1]);
	}
	printf("%.3lf\n",ans);
	return 0;
}

例题2.期望分数

同时开两个变量维护当前的期望得分和期望连续o的长度。

code
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n;
double len,ans;
char s[N];
int main()
{
	scanf("%d%s",&n,s+1);
	for(int i=1;i<=n;i++)
	{
		if(s[i]=='o')
		{
			ans+=len*2+1;
			len++;
		}
		else if(s[i]=='x') len=0;
		else
		{
			ans+=(len*2+1)/2.0;
			len=(len+1)/2.0;
		}
	}
	printf("%.4lf\n",ans);
	return 0;
}

例题3.路径长度

原题 lg P4316 绿豆蛙的归宿。
建反图进行拓扑排序,从终点倒推。

code
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,m,in[N],out[N];
double E[N];
struct node{
	int nxt,to,w;
}e[N];
int head[N],cnt;
void add(int u,int v,int w){
	e[++cnt]={head[u],v,w};head[u]=cnt;
}
queue<int> q;
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1,u,v,w;i<=m;i++) 
	{
		scanf("%d%d%d",&u,&v,&w);
		add(v,u,w);in[u]++;out[u]++;
	}
	E[n]=0;
	for(int i=1;i<=n;i++) if(!in[i]) q.push(i);
	while(!q.empty())
	{
		
		int u=q.front();q.pop();
		//cout<<u<<endl;
		for(int i=head[u];i;i=e[i].nxt)
		{
			int v=e[i].to;
			E[v]+=(E[u]*1.0+e[i].w)*1.0/out[v];
			if(--in[v]==0) q.push(v);
		}
	}
	printf("%.2lf\n",E[1]);
	return 0;
}

1.比赛得分

分别计算两队的期望得分。
对于 A 队第 x 个人,对答案贡献为 \(\frac{1}{n}\Sigma_{B_y<A_x}(A_x-B_y)^2\) 。
把平方展开,对序列排序后 y 的取值变为连续一段,指针维护。

code
#include<bits/stdc++.h>
using namespace std; 
const int N=1e7+5;
int n,A,B,C,a[N];
double ans;
int main()
{
	scanf("%d%d%d%d%d", &n, &A, &B, &C, a + 1);
	for (int i = 2; i <= n; i++)
		a[i] = ((long long) a[i - 1] * A + B) % 100000001;
	for (int i = 1; i <= n; i++)
		a[i] = a[i] % C + 1;
	ans+=1.0/max(a[1],a[n]);
	for(int i=2;i<=n;i++)
	{
		ans+=1.0/max(a[i],a[i-1]);
	}
	printf("%.3lf\n",ans);
	return 0;
}

2.电影问题

先看 \(i\) 再看 \(j\) 对答案的贡献为 \(l_i\times \frac{x_i}{y_i}\times \frac{y_j-x_j}{y_j}\)。
按照上述贡献的大小对原序列排序即为最大期望。

code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
const int mod=1004535809;
int n,f[N],g[N];
struct node{
	int l,x,y;
}a[N];
bool cmp(node a,node b){
	int c=a.l*a.x*(b.y-b.x);
	int d=b.l*b.x*(a.y-a.x);
	return c>d;
}
int qpow(int n,int k)
{
	int ans=1;
	while(k)
	{
		if(k&1) ans=ans*n%mod;
		n=n*n%mod;k>>=1;
	}
	return ans;
}
signed main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) scanf("%lld%lld%lld",&a[i].l,&a[i].x,&a[i].y);
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		int inv=qpow(a[i].y,mod-2);
		f[i]=((f[i-1]+a[i].l*(2*a[i].x-a[i].y)%mod*inv%mod+g[i-1]*(a[i].y-a[i].x)%mod*inv%mod)%mod+mod)%mod;
		g[i]=(g[i-1]+a[i].l*a[i].x%mod*inv%mod)%mod;
	}
	cout<<f[n]<<endl;
	return 0;
}

标签:code,期望,int,YbtOJ,d%,数学,ans,const,main
来源: https://www.cnblogs.com/ying-xue/p/16641502.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有