"蔚来杯"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]);
}
}