牛客白月赛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题解的主要内容,如果未能解决你的问题,请参考以下文章

牛客白月赛12题解

牛客白月赛14题解

牛客白月赛25题解

牛客白月赛3 题解

牛客白月赛8题解

牛客白月赛4 题解