牛客白月赛10题解
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客白月赛10题解相关的知识,希望对你有一定的参考价值。
https://ac.nowcoder.com/acm/contest/280#question
目录
勘测【递推】
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e6+10;
const LL mod=1e10+7;
LL a[N*5],f[N*5],n;
int main(void)
cin>>n;
f[0]=f[1]=1;
for(int i=1;i<=n;i++) f[i]=(f[i-1]+f[i-2])%mod;
a[1]=1;
for(int i=2;i<=n;i++) a[i]=(a[i-1]+f[i])%mod;
cout<<a[n];
return 0;
数学【数学 3,5,8,11整除的数】
- 3:各个位上的数总和取余为0则可以被3整除,否则则不行。
- 5:只看后2位,看能不能被5整除即可。因为100必定是5的倍数。
- 8: 只看后三位,看能不能被8整除即可。因为1000必定是8的倍数。
- 11:分别求奇位上的和,偶数位上的和。看两者的差的绝对值可不可以被11整除即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
vector<int>ve;
int main(void)
string s; cin>>s;
int index=s.size()-5,a;
index=max(index,0);
a=stoi(s.substr(index));
if(a%5==0) ve.push_back(5);
if(a%8==0) ve.push_back(8);
LL sum=0;
for(int i=0;i<s.size();i++) sum+=s[i]-'0';
if(sum%3==0) ve.push_back(3);
LL cnt1=0,cnt2=0;
for(int i=0;i<s.size();i++)
if(i&1) cnt2+=s[i]-'0';
else cnt1+=s[i]-'0';
if(abs(cnt1-cnt2)%11==0) ve.push_back(11);
sort(ve.begin(),ve.end());
if(!ve.size()) puts("No");
else
puts("Yes");
for(int i=0;i<ve.size();i++) cout<<ve[i]<<" ";
return 0;
约数
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
vector<LL>ve;
int main(void)
LL a,b; cin>>a>>b;
if(a>b) swap(a,b);
for(LL i=1;i<=sqrt(a);i++)
if(a%i==0)
if(b%i==0) ve.push_back(i);
if(a/i!=i&&b%(a/i)==0) ve.push_back(a/i);
sort(ve.begin(),ve.end());
for(int i=0;i<ve.size();i++) cout<<ve[i]<<" ";
return 0;
饥饿【最短路】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*4+10;
typedef pair<int,int> PII;
int h[N],e[N],w[N],ne[N],idx;
int st[N],dist[N],n,m,s,t;
void Dijkstra(int u)
memset(dist,0x3f,sizeof dist);
dist[u]=0;
priority_queue<PII,vector<PII>,greater<PII>>q;
q.push(0,u);
while(q.size())
auto temp=q.top(); q.pop();
u=temp.second;
if(st[u]) continue;
st[u]=1;
for(int i=h[u];i!=-1;i=ne[i])
int j=e[i];
if(dist[j]>dist[u]+w[i])
dist[j]=dist[u]+w[i];
q.push(dist[j],j);
void add(int a,int b,int c)
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
int main(void)
cin>>n>>m>>s>>t;
memset(h,-1,sizeof h);
while(m--)
int op,a,b,c; cin>>op>>a>>b>>c;
if(op==1) add(a,b,c),add(b,a,c);
Dijkstra(s);
if(dist[t]==0x3f3f3f3f) puts("My gold!!!");
else cout<<dist[t];
return 0;
方格跳跃【思路】
你会发现,每一个点到另一个点的路径是唯一确定的。
#include<bits/stdc++.h>
using namespace std;
const int N=2010;
int a[N][N],n,m,k;
int dist[N*N];
struct nodeint x,y;;
node ve[N*N];
int main(void)
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) cin>>a[i][j],ve[a[i][j]]=i,j;
for(int i=1;i<=k;i++)
for(int j=i+k;j<=n*m;j+=k)
int l1=ve[j-k].x,r1=ve[j-k].y;
int l2=ve[j].x,r2=ve[j].y;
int sum=abs(l2-l1)+abs(r2-r1);
dist[j]=dist[j-k]+sum;
int t; cin>>t;
while(t--)
int l,r; cin>>l>>r;
cout<<dist[r]-dist[l]<<endl;
return 0;
金币【思维】
你会发现每一层的结点数,在最后一步终将会与根节点处(这一点)。故只需判断每一层的结点的奇偶性即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int h[N],e[N],ne[N],idx;
int n,deep[N];
void add(int a,int b)
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
vector<int>ve;
void dfs(int u,int step,int fa)
deep[step]++;
for(int i=h[u];i!=-1;i=ne[i])
int j=e[i];
if(j==fa) continue;
dfs(j,step+1,u);
int main(void)
cin>>n;
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++)
int x; cin>>x;
if(!x) ve.push_back(i);
else add(x,i);
for(int i=0;i<ve.size();i++)
memset(deep,0,sizeof deep);
int j=1,ans=0;
dfs(ve[i],1,-1);
while(deep[j]) ans+=deep[j]%2,j++;
cout<<ans<<" ";
return 0;
创作打卡挑战赛
赢取流量/现金/CSDN周边激励大奖
以上是关于牛客白月赛10题解的主要内容,如果未能解决你的问题,请参考以下文章