我是靠谱客的博主 甜美学姐,最近开发中收集的这篇文章主要介绍牛客小白月赛 3,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

A题

按照题目模拟就行了,注意题目元音加了一个y就行

#include<iostream>
#include<string>
using namespace std;
const int maxn=2e5+5;
char yuan[6]={'a','e','i','o','u','y'};
int main()
{
string z;
while(cin>>z)
{
for(int i=0;i<=z.length();i++)
{
for(int j=5;j>=0;j--)
{
if(z[i]>=yuan[j])
{
z[i]=yuan[j];
break;
}
}
}
cout<<z<<endl;
}
}

B题

前缀和的使用:c,cw,cwb,cwbc都是根据上一个状态来进行的所以,每一个状态就是上一个组合的前缀和,算出cwbc的前缀和就是最终的答案;

#include<iostream>
#include<math.h>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;
const
ll m=2000120420010122;
int main()
{
ll a,b,c,d;
string s;
while(cin>>s)
{
a=b=c=d=0;
for(int i=0;i<=s.length()-1;i++)
{
if(s[i]=='c'||s[i]=='C')
{
a++;
a%=m;
}
else if(s[i]=='w'||s[i]=='W')
{
b+=a;
b%=m;
}
else if(s[i]=='b'||s[i]=='B')
{
c+=b;
c%=m;
}
if(s[i]=='c'||s[i]=='C')
{
d+=c;
d%=m;
}
}
cout<<d<<endl;
}
}

C题

把一个数n移除可以分成(n/k)取整的个数*k个数,当k==1的时候怎么都移除不完就是平局
当n/k<l的时候就可以不用考虑了;然后将数都算一遍,求出最后的和;求出所有数就变成了奇偶的问题了,求和可以用到前缀后来计算,奇就是先手赢.

#include<iostream>
#include<cstdio>
#include<math.h>
#include<algorithm>
#include<string>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int main()
{
int n[maxn]={0};
int l,r,k;
while(cin>>l>>r>>k)
{
ll s=0;
if(k==1)
{
cout<<"Draw"<<endl;
}
else
{
for(int i=1;i<=r;i++)
{
n[i]=n[i/k]*k+1;
}
for(int i=l;i<=r;i++)
{
s+=n[i];
}
if(s%2==1)
{
cout<<"XHRlyb"<<endl;
}
else
{
cout<<"Cwbc"<<endl;
}
}
}
}

D题

没看懂,下回在看

E题

F题

签到题,模拟一下,异或只有在相等的情况下等于0,要是c比b大异或就不可能为0,所以就是界限问题

#include<iostream>
#include<math.h>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
ll a,b,c,d;
while(cin>>a>>b>>c>>d)
{
if(c>b)
{
cout<<"0/1"<<endl;
}
else
{
ll zh=(b-a+1)*(d-c+1);
ll mina=max(a,c);
ll minb=min(b,d);
ll sz=minb-mina+1;
if(sz<0)
cout<<"0/1"<<endl;
else
cout<<sz/__gcd(sz,zh)<<"/"<<zh/__gcd(sz,zh)<<endl;//用最小公倍数来约分成最简形式
}
}
}

G题

树形dp的模板题
f[i][0]=f[j][1];//f[i][0]代表 i 没来,
f[i][1]=max(f[j][0],f[j][1]);//f[i][1]代表 i 来了的情况下,判断是没来天数多还是来了的天数多

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<math.h>
using namespace std;
typedef long long ll;
const int maxn=5e5+5;
struct edge
{
int pre,to;
}e[maxn*2];
int head[maxn],f[maxn][2];
int cnt=0;
void add(int x,int y)
{
e[++cnt].pre=head[x];
e[cnt].to=y;
head[x]=cnt;
}
void dfs(int x,int y)
{
for(int i=head[x];i;i=e[i].pre)
{
int s=e[i].to;
if(s==y)	continue;
dfs(s,x);
f[x][0]+=max(f[s][1],f[s][0]);
f[x][1]+=f[s][0];
}
}
int main()
{
int n,z;
cin>>n>>z;
for(int i=1;i<=n;i++)
f[i][1]=1;
int a,b;
for(int i=1;i<n;i++)
{
cin>>a>>b;
add(a,b);
add(b,a);
}
dfs(z,0);
cout<<f[z][1]<<endl;
return 0;
}

H题

根据2018来判断就行,将与2018的差值来取余来计算在第几个,取余的时候要在里面的取余-1在外面+1以免出现余成0的情况;比如
t=(cz%tg+10+5)%tg;
d=(cz%dz+12+11)%dz;
和这个
t=(cz%tg+10+4)%tg+1;
d=(cz%dz+12+10)%dz+1;
上面那个就会取余变为0,所以就会出现错误

#include<iostream>
#include<math.h>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
ll n;
ll tg=10,dz=12;
while(cin>>n)
{
ll cz=n-2018;
ll t,d;
t=(cz%tg+10+4)%tg+1;
d=(cz%dz+12+10)%dz+1;
cout<<t<<' '<<d<<endl;
}
}

I题

模拟题,就是数多了点,一点一点输入就行了;还有就是判断总分相等的情况是相差小于10的-5次方需要这样写
if((abs(a.zf-b.zf)<1e-5))
{
return a.name<b.name;
}

#include<iostream>
#include<math.h>
#include<string>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=2e5+5;
typedef long long ll;
struct node
{
string name;
double fz1,fz2,fz3,fz4,fz5;
double zf;
}xs[maxn];
bool px(node a,node b)
{
if((abs(a.zf-b.zf)<1e-5))
{
return a.name<b.name;
}
else
return a.zf>b.zf;
}
int main()
{
int n;
while(cin>>n)
{
double max1,max2,max3,max4,max5;
max1=max2=max3=max4=max5=0;
for(int i=1;i<=n;i++)
{
cin>>xs[i].name>>xs[i].fz1>>xs[i].fz2>>xs[i].fz3>>xs[i].fz4>>xs[i].fz5;
max1=max(max1,xs[i].fz1);
max2=max(max2,xs[i].fz2);
max3=max(max3,xs[i].fz3);
max4=max(max4,xs[i].fz4);
max5=max(max5,xs[i].fz5);
}
for(int i=1;i<=n;i++)
{
xs[i].fz1=xs[i].fz1*600.0/max1;
xs[i].fz2=xs[i].fz2*300.0/max2;
xs[i].fz3=xs[i].fz3*300.0/max3;
xs[i].fz4=xs[i].fz4*300.0/max4;
xs[i].fz5=xs[i].fz5*300.0/max5;
xs[i].zf=xs[i].fz1*0.25+(xs[i].fz2+xs[i].fz3)*0.25+(xs[i].fz4+xs[i].fz5)*0.5;
}
sort(xs+1,xs+1+n,px);
for(int i=1;i<=n;i++)
{
cout<<xs[i].name;
printf(" %.5lfn",xs[i].zf);
}
}
}

J题

最后

以上就是甜美学姐为你收集整理的牛客小白月赛 3的全部内容,希望文章能够帮你解决牛客小白月赛 3所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部