签到题
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 举报,一经查实,本站将立刻删除。