牛客白月赛7题解

Posted 辉小歌

tags:

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

https://ac.nowcoder.com/acm/contest/190/A

目录

送分题【找规律】


直接用它的代码交会T。看代码加打表找到规律即可。

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main()

    long long n;
    cin >> n;
    if (n < 20180001) cout<<n+2017;
    else cout<<20182017;
    return 0;

炸弹游戏【博弈论】


f[i] 表示在第i秒 Alice 是必胜还是必败
一个必败态的后继状态全部是必胜态,一个必胜态的后继存在比败态。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int f[N],t,a,b;
int main(void)

	cin>>t>>a>>b;
	for(int i=0;i<=t;i++)
	
		if(f[i]) continue;
		for(int j=a;j<=b;j++) f[i+j+1]=1;
		f[i+1]=1;//不调
	
	if(f[t]) puts("Alice");
	else puts("Bob");
	return 0;

谁是神射手【简单计算概率】

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

	double a,b; cin>>a>>b;
	a/=100,b/=100;
	double sum1=a;
	double sum2=(1-a)*b;
	if(sum1>sum2) puts("MWH");
	else if(sum1<sum2) puts("CSL");
	else puts("equal");
	return 0;

明七暗七【不会 计数DP】

Applese的超能力【模拟】


类似于换瓶盖,模拟一下即可。需要特判m==1这种情况,不然会T。

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

	LL n,m; cin>>n>>m;
	if(m==1)
	
		if(n==1) puts("Yes");
		else puts("No");
		return 0;
	
	while(n>=m) n=n/m+n%m;
	if(n==1) puts("Yes");
	else puts("No");
	return 0;

BFS【签到】

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

	string s; cin>>s;
	for(int i=0;i<s.size();i++) s[i]=tolower(s[i]);
	int a=s.find("bob");
	cout<<a;
	return 0;

CSL分苹果【DP】


贪心好像不行。考虑DP。
f[i][j] 表示考虑前i个 总和为j可不可以凑出来。

#include<bits/stdc++.h>
using namespace std;
const int N=110;
const int M=1e4+10;
int f[N][M],n,sum,w[N];
int main(void)

	cin>>n;
	for(int i=1;i<=n;i++) cin>>w[i],sum+=w[i];
	f[0][0]=1;
	for(int i=1;i<=n;i++)
	
		for(int j=0;j<M;j++)
		
			if(f[i-1][j]) f[i][j]=1;
			if(j>=w[i]&&f[i-1][j-w[i]]) f[i][j]=1;
		
	
	set<int>st;
	for(int i=1;i<=n;i++)
		for(int j=0;j<M;j++) if(f[i][j]) st.insert(j);//将可以凑出来的所有的数存起来。
	int c=1e9,a=0,b=0;
	for(auto i=st.begin();i!=st.end();i++)
	
		int l=*i;
		int r=sum-l;
		if(l>r) swap(l,r);
		if(r-l<c) c=r-l,a=l,b=r;//存差最小的值。
	
	cout<<a<<" "<<b<<endl;
	return 0;

也可用0/1背包来做。 因为要平分,故最小的那个一定小于等于总和除以2。
故就转化成了,体积不超过m的最大值。

#include<bits/stdc++.h>
using namespace std;
const int N=110;
const int M=1e4+10;
int f[N][M],n,m,t,w[N];
int main(void)

	cin>>n;
	for(int i=1;i<=n;i++) cin>>w[i],t+=w[i];
	m=t/2;
	for(int i=1;i<=n;i++)
	
		for(int j=0;j<=m;j++)
		
			f[i][j]=f[i-1][j];
			if(j>=w[i]) f[i][j]=max(f[i][j],f[i-1][j-w[i]]+w[i]);
		
	
	cout<<f[n][m]<<" "<<t-f[n][m]<<endl;
	return 0;

CSL的校园卡【状态压缩 搜索】

#include<bits/stdc++.h>
using namespace std;
int st[1<<16][4][4][4][4];
int dx[4]=-1,0,0,1;
int dy[4]=0,-1,1,0;
int n,m,stx,sty,id;//id是最终的状态
string s[105];
struct nodeint id,x1,y1,x2,y2,t;;//状态 一号点  二号点  时间
int bfs(int x,int y)

	memset(st,0,sizeof st);
	st[1<<(x*m+y)][x][y][x][y]=1;
	queue<node>q; q.push(1<<(x*m+y),x,y,x,y,0);
	while(q.size())
	
		auto temp=q.front(); q.pop();
		int x1=temp.x1,y1=temp.y1;
		int x2=temp.x2,y2=temp.y2;
		int idx=temp.id,t=temp.t;
		if(idx==id) return t;
		for(int i=0;i<4;i++)
		
			int xx1=x1+dx[i],yy1=y1+dy[i];
			if(xx1<0||xx1>=n||yy1<0||yy1>=m) continue;
			if(s[xx1][yy1]=='X') continue;
			for(int j=0;j<4;j++)
			
				int xx2=x2+dx[j],yy2=y2+dy[j];
				if(xx2<0||xx2>=n||yy2<0||yy2>=m) continue;
				if(s[xx2][yy2]=='X') continue;
				int tempid=idx | (1<<(xx1*m+yy1)) | (1<<(xx2*m+yy2));
				if(st[tempid][xx1][yy1][xx2][yy2]) continue;
				q.push(tempid,xx1,yy1,xx2,yy2,t+1);
				st[tempid][xx1][yy1][xx2][yy2]=1;
			
		
	
    return -1;

int main(void)

	cin>>n>>m;
	for(int i=0;i<n;i++) cin>>s[i];
	for(int i=0;i<n;i++)
	
		for(int j=0;j<m;j++)
		
			if(s[i][j]=='O') id|=(1<<(i*m+j));
			if(s[i][j]=='S')
			
				stx=i,sty=j;
				id|=(1<<(i*m+j));
			
		
	
	cout<<bfs(stx,sty);
	return 0;

新建 Microsoft Office Word 文档【模拟】


用小根堆来存。

#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int>>q;
int idx=1;
map<int,int>mp;
int main(void)

	int n; cin>>n;
	q.push(idx);
	while(n--) 
	
		string s; cin>>s;
		if(s=="New") 
		
			int temp=q.top(); q.pop();
			if(!q.size()) q.push(++idx);
			cout<<temp<<endl;
			mp[temp]=1;
		
		if(s=="Delete")
		
			int k; cin>>k;
			if(mp[k])
			
				cout<<"Successful"<<endl;
				mp[k]=0;
				q.push(k);
			
			else cout<<"Failed"<<endl;
		
	
	return 0;

方格填色【不会 DP】

阅读世界,共赴山海 423全民读书节,邀你共读

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

牛客白月赛8题解

牛客白月赛4 题解

牛客白月赛11题解

牛客白月赛12题解

牛客白月赛14题解

牛客白月赛32题解