"蔚来杯"2022牛客暑期多校训练营(加赛)

M Maimai DX 2077

模拟题

#include<cstdio>
int v[6][6]={{10,10,8,5,0},{20,20,16,10,0},{30,30,24,15,0},
			{50,50,25,20,0},{10,5,4,3,0}},a[6],A,B,A0,B0;
int main(){
	
	for (int i=0;i<4;++i) {
		for (int j=0;j<5;++j) scanf("%d",a+j);
		for (int j=0;j<5;++j) A+=a[j]*v[i][0],A0+=a[j]*v[i][j];
	}
	for (int j=0;j<5;++j) B+=a[j]*v[4][0],B0+=a[j]*v[4][j];
	printf("%.9lf",A0*100.0/A+B0*1.0/B);
	
	return 0;
}

H Here is an Easy Problem of Zero-chan

分析: 树形转移dp

设该点为x 父亲为fa 转移的其中一个儿子为 y

sz[i] 表示以i为根子树的大小 cnt2[i] 表示i的2因子个数 cnt5[i] 表示i的5因子个数

x值的因数2的个数为 sz[x]×cnt2[x]+(sz[fa]-sz[x])×cnt2[fa]+pre

y值的因数2的个数为 sz[y]×cnt2[y]+(sz[x]-sz[y])×cnt2[x]+(sz[fa]-sz[x])×cnt2[fa]+pre 其中pre为之前的值

两者差值为sz[y]×(cnt2[y]-cnt2[x])

直接递推推过去就好

#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

int n,q;
vector<int> v[100010];
int ans[100010],t[100010],f[100010],dt[100010],df[100010];
int siz[100010];

void dfs(int x){
	siz[x]=1;
	for(auto i:v[x]){
		if(siz[i])continue;
		dfs(i);
		siz[x]+=siz[i];
	}
}

void dfs2(int x){
	for(auto i:v[x]){
		if(siz[i]>siz[x])continue;
		t[i]=t[x]-dt[x]*siz[i]+dt[i]*siz[i];
		f[i]=f[x]-df[x]*siz[i]+df[i]*siz[i];
		dfs2(i);
	}
}

int main(){
	scanf("%d %d",&n,&q);
	for(int i=1;i<=n;i++){
		int dq=i;
		while(dq%2==0){
			dt[i]++;dq/=2;
		}
		while(dq%5==0){
			df[i]++;dq/=5;
		}
	}
	for(int i=1;i<n;i++){
		int x,y;scanf("%d %d",&x,&y);
		v[x].push_back(y);
		v[y].push_back(x);
	}
	dfs(1);dfs2(1);
	for(int i=1;i<=q;i++){
		int x;scanf("%d",&x);
		printf("%d\n",min(t[x],f[x]));
	}
	return 0;
}

E Everyone is bot

注意:每个人都最大化自己的收益 相当于很多人的博弈论

确实不好下手思考

找特殊情况考虑

如果n=10 p=9 因为第一个人知道当n=9 p=9的时候没有人会复读 所以自己复读了使得10变为9就能最大收益

如果n=10 p=3 因为n=3 p=3 不会有人选 所以变为n=7 p=3 同理 最后变为n=1 p=3 此时选了一定最大收益

综上

题目还是非常有难度

#include<stdio.h>
int n,p,k,i=0,a[1002][1002];
int main(){
    for(scanf("%d%d",&n,&p);i<n;printf("%d ",i<n%p?a[i][i]:0),++i)for(k=0;k<n;++k)scanf("%d",&a[i][k]);
}

J Jellyfish and its dream

题目很巧妙

#include<stdio.h>
int main(){
    int T,n,i,d,a[1000002];
    for(scanf("%d",&T);T;printf("%s\n",d<0?"No":"Yes"),--T){
        for(scanf("%d",&n),d=0,i=0;i<n;++i)scanf("%d",&a[i]);
        for(i=0;i<n;++i)d+=((a[i]+1)%3==a[(i+1)%n])-((a[i]+2)%3==a[(i+1)%n]);
    }
}
posted @ 2022-09-08 10:46  wzx_believer  阅读(22)  评论(0编辑  收藏  举报