2021.7.15提高B组模拟赛

2021.7.16 2021.7.16 2021.7.16 模拟赛 Ⅳ Ⅳ
目录:

T1.Colorful Circle
T2.Reflect Damage
T3.ptyNB!
T4.Image Recognition 

T 1 : C o l o r f u l T1:Colorful T1Colorful C i r c l e Circle Circle

在这里插入图片描述

分析:

期望 d p dp dp
f i , 0 / 1 f_{i,0/1} fi,0/1表示到第 i i i个宝石 当前最后一个宝石 和最前面宝石颜色相同的期望
然后注意环 判 i = n i=n i=n的情况
那么就是期望 × \times × 长度 × \times × 概率了 注意颜色数量的变化
以及精度 注意保留 或 e p s eps eps

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=205;
int n,m;
long double P[N],p,ans,f[N][2];
int main(){
	scanf("%d%d",&n,&m);
	if(m==1){
		printf("%d",n);
		return 0;
	}
	p=1.0000/(m*1.0000);
	P[0]=1.0000;
	for(int i=1;i<=n;i++)
		P[i]=P[i-1]*p;  //概率
	for(int i=1;i<=n;i++)
	{
		memset(f,0,sizeof f);
		f[i][1]=1.0000;
		if(i==n){
			ans+=P[n]*n*1.0000*(m*1.0000);
			continue;
		}
		for(int j=i;j<=n;j++)
			for(int k=j+1;k<=n;k++)
			{
				f[k][0]+=f[j][0]*P[k-j]*(k-j)*1.0000*(m*1.0000-2.0000)+f[j][1]*P[k-j]*(k-j)*1.0000*(m*1.0000-1.0000);
				f[k][1]+=f[j][0]*P[k-j]*(k-j)*1.0000;
			}
		for(int j=0;j<=n-i;j++)
			ans+=f[n-j][0]*P[i+j]*(i+j)*m*1.0000;
	}
	printf("%.10Lf",ans);
	
	return 0;
}

T 2 : R e f l e c t T2:Reflect T2Reflect D a m a g e Damage Damage

在这里插入图片描述

分析:

a n s i ans_i ansi i i i最终受到的伤害 G i G_i Gi i i i受伤害占总伤害比例 T i , j T_{i,j} Ti,j i i i j j j伤害的比例
i i i受伤害肯定都来自别人给的 加上初始的
那么就有:
a n s i G i = ∑ j ≠ i a n s j G j × T j , i + a i \frac{ans_i}{G_i}=\sum_{j≠i}\frac{ans_j}{G_j}\times T_{j,i}+a_i Giansi=j=iGjansj×Tj,i+ai
于是直接高斯消元解方程

CODE:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define eps 1e-9
using namespace std;
const int N=205;
int n,m,a[N];
long double T[N][N],Matrix[N][N],ans[N];
int main(){
	scanf("%d",&n); 
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		T[i][i]=1;
	}
	scanf("%d",&m);
	while(m--)
	{
		int x,y;
		double div;
		scanf("%d%d%lf",&x,&y,&div);
		T[x][x]-=div;T[x][y]+=div;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			if(i^j) Matrix[i][j]=-T[j][i]/T[j][j];
		Matrix[i][i]=1.0/T[i][i];
		Matrix[i][n+1]=-a[i];
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
			if(fabs(Matrix[j][i])>eps)
			{
				for(int k=i;k<=n+1;k++)
					swap(Matrix[i][k],Matrix[j][k]);
				break;
			}	
		long double qwq=Matrix[i][i];
		for(int j=i;j<=n+1;j++)
			Matrix[i][j]/=qwq;
		for(int j=i+1;j<=n;j++)
		{
			qwq=Matrix[j][i];
			for(int k=i;k<=n+1;k++)
				Matrix[j][k]-=Matrix[i][k]*qwq;
		}
	}
	ans[n+1]=1;
	for(int i=n;i>=1;i--)
		for(int j=i+1;j<=n+1;j++)
			ans[i]-=Matrix[i][j]*ans[j];
	for(int i=1;i<=n;i++)
		printf("%.6Lf\n",ans[i]);
	
	return 0;
}

T 3 : T3: T3鱼跃龙门

在这里插入图片描述
在这里插入图片描述

分析:

至于 p t y N B ptyNB ptyNB 应该是胖头鱼 n b nb nb
青蛙的约会类似 e x g c d exgcd exgcd
要满足 x ( x + 1 ) 2 % n = 0 \frac{x(x+1)}{2}\%n=0 2x(x+1)%n=0 那么 n ∣ x ( x + 1 ) 2 n|\frac{x(x+1)}{2} n2x(x+1) 就是 2 n ∣ x ( x + 1 ) 2n|x(x+1) 2nx(x+1)
p q = 2 n pq=2n pq=2n x = q b , x + 1 = p a x=qb,x+1=pa x=qb,x+1=pa 就是 a p − b q = 1 ap-bq=1 apbq=1
就直接 e x g c d exgcd exgcd 即可

CODE:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int T;
const int N=1e6+5;
const ll inf=1e18;
bool isprime[N];
int prime[N],tot,cnt;
ll n,fac[55],ans,x,y;
void Prime()
{
	memset(isprime,1,sizeof isprime);
	isprime[0]=isprime[1]=0;
	for(int i=2;i<N;i++)
	{
		if(isprime[i])
			prime[++tot]=i;
		for(int j=1;j<=tot&&i*prime[j]<N;j++)
		{
			isprime[i*prime[j]]=0;
			if(i%prime[j]==0) break;
		}
	}
} 
void factor(ll x)
{
	cnt=0;
	for(int i=1;i<=tot&&prime[i]<=x;i++)
	{
		if(x%prime[i]==0)
		{
			fac[++cnt]=1;
			while(x%prime[i]==0)
				x/=prime[i],fac[cnt]*=prime[i];
		}
	}
	if(x) fac[++cnt]=x;
}
void exgcd(ll a,ll b)
{
	if(b==0)
	{
		x=1;
		y=0;
		return;
	}
	exgcd(b,a%b);
	ll k=x;
	x=y;y=k-a/b*y;
}
void dfs(int dep,ll a,ll b)
{
	if(dep==cnt+1)
	{
		exgcd(a,b);
		y=(-y)%a;
		if(y<=0) y+=a;
		ans=min(ans,y*b);
		return;
	}
	dfs(dep+1,a*fac[dep],b);
	dfs(dep+1,a,b*fac[dep]);
}
int main(){
	Prime();
	scanf("%d",&T);
	while(T--)
	{
		scanf("%lld",&n);
		if(n==1){
			puts("1");
			continue;
		}
		n<<=1;
		factor(n);
		ans=inf;
		dfs(1,1,1);
		printf("%lld\n",ans);
	} 
	
	return 0;
}

T 4 : I m a g e T4:Image T4Image R e c o g n i t i o n Recognition Recognition

在这里插入图片描述
在这里插入图片描述

分析:

数据近似随机 所以 O ( n 2 ) O(n^2) O(n2)可过

64 64 64位整数 划分成 4 4 4块 每块 16 16 16
那么根据小学知识 如果存在汉明距离为 3 3 3 4 4 4块里肯定有 1 1 1块相同
那就以这个 16 16 16位整数 作为 m a p map map的引索 遍历可能的即可
注意 64 64 64位开 u n s i g n e d unsigned unsigned l o n g long long l o n g long long

CODE:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map> 
using namespace std;
typedef unsigned long long ull;
const int N=150005;
int n,next[N][5],vis[N],ans;
ull key=(1<<16),k[N],qwq[N][5];
map<ull,int> G[5];
ull lowbit(ull x){return x&(-x);}
bool check(ull x,ull y)
{
	ull val=x^y;
	int dis=0;
	while(val)
	{
		++dis;
		if(dis>3) return 0;
		val-=lowbit(val);
	}
	return dis==3;
}
int main(){
//	freopen("hashing.in","r",stdin);
//	freopen("hashing.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		ull x; ans=0;
		scanf("%llu",&x);
		k[i]=x;
		for(int j=1;j<=4;j++)
			qwq[i][j]=x%key,x/=key;
		for(int j=1;j<=4;j++)
		{
			if(G[j].find(qwq[i][j])!=G[j].end())
			{
				next[i][j]=G[j][qwq[i][j]];
				for(int p=next[i][j];p;p=next[p][j])
				{
					if(vis[p]==i) continue;
					vis[p]=i;
					if(check(k[i],k[p]))
						ans++;
				}
			}
			G[j][qwq[i][j]]=i;
		}
		printf("%d\n",ans);
	}
	
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,需要将数据转换成pandas的DataFrame格式,代码如下: ```python import pandas as pd data = {'日期/项目(A厂)': ['2021.1.1', '2021.1.2', '2021.1.3', '2021.1.4', '2021.1.5', '2021.1.6', '2021.1.7', '2021.1.8', '2021.1.9', '2021.1.10', '2021.1.11', '2021.1.12', '2021.1.13', '2021.1.14', '2021.1.15', '2021.1.16', '2021.1.17', '2021.1.18', '2021.1.19', '2021.1.20', '2021.1.21', '2021.1.22', '2021.1.23', '2021.1.24', '2021.1.25', '2021.1.26', '2021.1.27', '2021.1.28', '2021.1.29', '2021.1.30', '2021.1.31'], '进水': [149, 164, 86, 164, 146, 136, 93, 96, 90, 134, 141, None, None, None, 138, 138, 161, None, None, None, None, None, None, None, None, None, 114, 107, 121, None, None], 'COD': [20.1, 10.1, 37.1, 16.4, 10.9, 18.7, 17.2, 17.1, 18.5, 23.8, 17.7, 15.6, 11.0, 19.5, 18.5, 15.2, 16.5, 16.3, 17.3, 29.5, 20.7, 19.5, 18.9, 12.0, 23.9, 11.7, 10.6, 11.1, 14.2, 10.6, 12.5], '氨氮': [3.54, 0.65, 1.92, 1.44, 0.84, 1.59, 1.15, 1.61, 1.42, 2.46, 2.50, 1.48, 1.04, 3.55, 1.60, 1.82, 2.60, 2.10, 1.54, 3.54, 2.67, 3.25, 2.12, 2.38, 2.34, 1.51, 1.58, 1.31, 1.66, 1.26, 1.71], '总磷': [30.7, 20.1, 44.1, 21.5, 18.4, 29.7, 23.5, 24.2, 26.9, 31.7, 28.3, None, None, 24.0, 26.9, 27.8, 20.5, 27.9, 31.8, 37.8, 24.9, 29.3, None, 23.4, 23.5, 12.4, 27.9, 19.3, 17.6, 19.5, 15.4]} df = pd.DataFrame(data) ``` 接下来,我们可以使用matplotlib库进行数据可视化,这里我选择绘制折线图。代码如下: ```python import matplotlib.pyplot as plt # 设置图形大小 plt.figure(figsize=(10, 6)) # 绘制折线图 plt.plot(df['日期/项目(A厂)'], df['进水'], label='进水') plt.plot(df['日期/项目(A厂)'], df['COD'], label='COD') plt.plot(df['日期/项目(A厂)'], df['氨氮'], label='氨氮') plt.plot(df['日期/项目(A厂)'], df['总磷'], label='总磷') # 添加标题和标签 plt.title('A厂水质监测', fontsize=16) plt.xlabel('日期', fontsize=12) plt.ylabel('含量', fontsize=12) # 添加图例 plt.legend() # 显示图形 plt.show() ``` 运行上述代码,即可得到一张含有4条曲线的折线图,用于展示A厂水质监测数据的趋势。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值