微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

2022牛客多校联赛加赛 题解

比赛传送门

签到题

M题 Maimai DX 2077

题目大意
有个音游叫 Maimai DX 2077。
这个音游有四种音符,每种音符有五个判定。
不同音符的不同判定会获得不同基础分数。
绝赞的判定单独计算分数。
给定一次游玩每种音符每种判定的数量,问达成度。

考察内容
分类讨论

分析

#include<bits/stdc++.h>
using namespace std;

const int N=1e6+7;

int n,k;
double A0=0,B0=0,A=0,B=0;

int main(){
	int c;
	for(int i=1;i<=4;i++){
		for(int j=1;j<=5;j++){
			cin>>c;
			if(i==1){
				A+=c;
				if(j==1||j==2)A0+=c;
				if(j==3)A0+=0.8*c;
				if(j==4)A0+=0.5*c;
			}
			if(i==2){
				A+=2*c;
				if(j==1||j==2)A0+=2*c;
				if(j==3)A0+=1.6*c;
				if(j==4)A0+=1.0*c;
			}
			if(i==3){
				A+=3*c;
				if(j==1||j==2)A0+=3*c;
				if(j==3)A0+=2.4*c;
				if(j==4)A0+=1.5*c;
			}
			if(i==4){
				A+=5*c,B+=c;
				if(j==1)A0+=5*c,B0+=c;
				if(j==2)A0+=5*c,B0+=0.5*c;
				if(j==3)A0+=2.5*c,B0+=0.4*c;
				if(j==4)A0+=2*c,B0+=0.3*c;
			}
		}
	}
	printf("%.9lf\n",(A0/A+B0/B*0.01)*100);
}

H题 Here is an Easy Problem of Zero-chan

题目大意
有一颗 n 个节点且以 1 为根的有根树。
第 i 个点的点权为 i。
多次查询编号为 x 的点, ∏n/i=1 lca(i, x) 的末尾有多少个零。

考察内容
dfs序,差分

分析
末尾0的个数即因子中2与5的数量取min;
官方题解后半部分:

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+5;
vector<int>g[N];
int sz[N],dp[N],w2[N],w5[N];

void dfs(int u,int f){//遍历出子树大小 
	sz[u]=1;
	for(auto v:g[u]){
		if(v==f)continue;
		dfs(v,u);
		sz[u]+=sz[v];
	}
}

void dfsa(int u,int f,int cnt2,int cnt5){//遍历出答案,预处理 
	dp[u]=min(cnt2,cnt5);
	for(auto v:g[u]){
		if(v==f)continue;
		dfsa(v,u,cnt2+sz[v]*(w2[v]-w2[u]),cnt5+sz[v]*(w5[v]-w5[u]));
	}
}

int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int n,q;
	cin>>n>>q;
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		g[u].emplace_back(v);
		g[v].emplace_back(u);
	}
	for(int i=1;i<=n;i++){
		int x=i;
		while(x%2==0)w2[i]++,x/=2;
		while(x%5==0)w5[i]++,x/=5;
	}
	dfs(1,0);
	dfsa(1,0,0,0);
	while(q--){
		int x;
		cin>>x;
		cout<<dp[x]<<endl;
	}
}

基本题

E题 Everyone is bot

题目大意
有 n 个人打算在群里复读。
一次复读的过程如下:
每一轮,n 个人按照编号从小到大依次执行以下操作。
如果这个人在前几轮已经进行过复读,他不会再次复读。也就是说,每
个人最多只会复读一次。
否则他可以选择是否进行复读。
如果某一轮没有人进行复读,那么复读的过程结束。
对于第 i 个人,如果他是所有人中第 j 个进行复读的,他会获得 ai,j 瓶
冰红茶。
如果他是倒数第 p 个进行复读的,他只会得到-154瓶冰红茶。
每个人最佳操作,求获得冰红茶数量
考察内容
博弈论

分析
前n%p个人复读,后续不进行,因为一旦后续有进行,就有可能成为倒数第p个。

#include<bits/stdc++.h>
using namespace std;

const int N=1e3+5;

int a[N];

int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int n,p,r,op;
	cin>>n>>p;
	r=n%p;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>op;
			if(i<=r&&i==j)a[i]=op;
		}
	}
	for(int i=1;i<=n;i++){
		cout<<a[i]<<' ';
	}
	cout<<endl;
}

原文地址:https://www.jb51.cc/wenti/3280540.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐