牛客月赛42题解完结

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客月赛42题解完结相关的知识,希望对你有一定的参考价值。

冰狱寒岚【简单】


https://ac.nowcoder.com/acm/contest/26561/A
就是打表即可,然后查询即可。

#include<bits/stdc++.h>
using namespace std;
int n,m,t;
vector<int>ve;
int main(void)

	for(int i=0;i<1024;i++) ve.push_back(i);
	for(int i=1024;i>0;i--) ve.push_back(-i);
	cin>>n;
	while(n--)
	
		int x;  cin>>x;
		cout<<ve[x%2048]<<" ";
	
	return 0;

光之屏障【简单】

https://ac.nowcoder.com/acm/contest/26561/B
打表,二分找答案。

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
vector<LL>ve;
int main(void)

	int t; cin>>t;
	for(int i=0;i<=31;i++) ve.push_back(pow(2,i));
	while(t--)
	
		LL a,b; cin>>a>>b;
		int l=lower_bound(ve.begin(),ve.end(),a)-ve.begin();
		int r=upper_bound(ve.begin(),ve.end(),b)-ve.begin();
		if(l>=r) puts("-1");
		else cout<<ve[l]<<endl;
	
	return 0;

想复杂了,数据很小,其实直接模拟即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
vector<LL>ve;
int main(void)

	int t; cin>>t;
	while(t--)
	
		LL a,b; cin>>a>>b;
		LL sum=1;
        while(sum<a) sum*=2;
		if(sum>=a&&sum<=b) cout<<sum<<endl;
		else cout<<-1<<endl;
	
	return 0;

寒潭烟光【简单】


https://ac.nowcoder.com/acm/contest/26561/C
他这个是,前缀和数组的平均值,加一个x,总和加了(n+1)*x

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
int main(void)

	int t; cin>>t;
	while(t--)
	
		LL n,f,x0; cin>>n>>f>>x0;
		LL sum=(n*(f+x0)+x0)/(n+1);
		cout<<sum<<endl;
	
	return 0;

金蛇狂舞【bfs】


https://ac.nowcoder.com/acm/contest/26561/D
bfs即可,通过数据范围可以知道阶乘一般不会太大,因为太大显然是无意义的。

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=15;
LL f[N];
LL bfs(int x,int y)
	
	unordered_map<LL,LL>mp; mp[x]=1;
	queue<pair<LL,LL>>q; q.push(x,0);
	while(q.size())
	
		auto temp=q.front(); q.pop();
		int u=temp.first,step=temp.second;
		if(step>7) continue;
		if(u==y) return step;
		LL a[3]=0;
		a[1]=ceil(sqrt(u*1.0)),a[2]=floor(sqrt(u*1.0));
		if(u>15) a[0]=0;
		else a[0]=f[u];
		for(int i=0;i<3;i++)
		
			if(!i&&u>=N) continue;
			if(!mp[a[i]]) 
			
				q.push(a[i],step+1);
				mp[a[i]]++;
			
		
	
	return -1;

int main(void)

	f[0]=1;
	for(int i=1;i<N;i++) f[i]=f[i-1]*i;
	LL t; cin>>t;
	while(t--)
	
		LL x,y; cin>>x>>y;
		cout<<bfs(x,y)<<endl;
	
	return 0;

暗灭侵蚀【模拟】


https://ac.nowcoder.com/acm/contest/26561/E

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
int main(void)

	LL t; cin>>t;
	while(t--)
	
		LL a[3],n;
		priority_queue<LL>heap;
		for(int i=0;i<3;i++) cin>>a[i],heap.push(a[i]);
		cin>>n;
		int cnt=0;
		while(1)
		
			for(int i=0;i<3;i++) a[i]=heap.top(),heap.pop();
			if(a[0]>=n) break;
			a[2]=a[0]*2-a[2];
			for(int i=0;i<3;i++) heap.push(a[i]);
			cnt++;
		
		cout<<cnt<<endl;
	
	return 0;

火凤燎原【思维】


https://ac.nowcoder.com/acm/contest/26561/F
就是,统计每个点的度,然后枚举每一个点计算其贡献。
根据题意可知,只有度大于等于3才是蒲公英。

#include<bits/stdc++.h> 
using namespace std;
typedef long long int LL;
const int N=1e5+10;
int d[N],t,n;
int main(void)

	cin>>t;
	while(t--)
	
		cin>>n;
        for(int i=0;i<=n;i++) d[i]=0;
		for(int i=1;i<n;i++) 
		
			int a,b; scanf("%d%d",&a,&b);
			d[a]++,d[b]++;
		
		LL ans=0;
		for(int i=1;i<=n;i++)//枚举每一个点
			if(d[i]>=3) ans+=n-1-d[i];
		printf("%lld\\n",ans);
	
	return 0;

以上是关于牛客月赛42题解完结的主要内容,如果未能解决你的问题,请参考以下文章

牛客月赛42

牛客月赛43

博客总结第十周+牛客月赛

8/12 最小表示法+牛客月赛

牛客月赛:走出迷宫(Java)

牛客月赛60 F.被抓住的小竹(数学&推式子)