牛客白月赛7题解
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客白月赛7题解相关的知识,希望对你有一定的参考价值。
https://ac.nowcoder.com/acm/contest/190/A
目录
- 送分题【找规律】
- 炸弹游戏【博弈论】
- 谁是神射手【简单计算概率】
- 明七暗七【不会 计数DP】
- Applese的超能力【模拟】
- BFS【签到】
- CSL分苹果【DP】
- CSL的校园卡【状态压缩 搜索】
- 新建 Microsoft Office Word 文档【模拟】
- 方格填色【不会 DP】
送分题【找规律】
直接用它的代码交会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题解的主要内容,如果未能解决你的问题,请参考以下文章