牛客小白月赛7题解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/C_13579/article/details/82719003

没想到身为菜鸟的我也能做7题,嘿嘿嘿

A-送分题:https://www.nowcoder.com/acm/contest/190/A

思路:该题直接交会爆内存。。。观察(跑几组数据)发现只要n大于等于2018001就都为 20182017,其他的则为 n+2017

Code :

#include<iostream>
using namespace std;

int main()
{
    long long n;
    cin >> n;
    if(n<20180001)	cout<<n+2017<<endl;
    else	cout << 20182017 << endl;
    return 0;
}

 

B-自杀游戏:https://www.nowcoder.com/acm/contest/190/B

思路:可以用dp来做,对于dp[i],只要它能够转移到必败的状态,那么dp[i]一定是必胜的,否则就是必败的

Code:

#include<iostream>
using namespace std;

const int MAX_N=100005;
int a,b,n;
int dp[MAX_N];

int main()
{
	while(cin>>n>>a>>b){
		++a;	++b;
		dp[0]=-1;
		for(int i=1;i<=n;++i)
		{
			if(dp[i-1]==-1){
				dp[i]=1;
			}else{
				if(i<a)	dp[i]=-1;
				for(int j=a;j<=b;++j)
					if(i>=j&&dp[i-j]==-1){
						dp[i]=1;	break;
					}
				if(dp[i]!=1)	dp[i]=-1;
			}
		}
		if(dp[n]==1)	cout<<"Alice"<<endl;
		else	cout<<"Bob"<<endl;
	}
	
	return 0;
}

C-谁是神枪手:https://www.nowcoder.com/acm/contest/190/C

思路:不难求出,对于A胜概率 Pa,B胜概率 Pb为

 B胜条件 Pb-Pa>0 最后可化为 (100-a)*b>100*a

那么平局时(100-a)*b=100*a

A胜:(100-a)*b<100*a

Code :

#include<iostream>
using namespace std;
 
int a,b;
 
int main()
{
    while(cin>>a>>b){
        if((100-a)*b>100*a)  cout<<"CSL"<<endl;
        else	if((100-a)*b==100*a)	cout<<"equal"<<endl;
        else	cout<<"MWH"<<endl;
    }
     
    return 0;
}

D-明七暗七:https://www.nowcoder.com/acm/contest/190/D

思路:数位DP+二分。利用数位DP可以求出从1到n的满足条件的个数,而对于求具体的数字,则可以用二分查找来求解

dp[i][j][k]: 前i位余数为j,是否有7的个数

Code :
 

#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;

LL n,m;
int a[20];
LL dp[20][10][2];

LL Find(LL p);
LL DFS(int k,int mod,int boo,int bo);
int main()
{
	ios::sync_with_stdio(false);
	while(cin>>n>>m){
		memset(dp,-1,sizeof(dp));
		LL l=n,r=1e14,t=Find(n);
		while(l<=r){
			LL h=(l+r)/2;
			if(Find(h)-t>=m)	r=h-1;
			else	l=h+1;
		}
		cout<<l<<endl;
	}
	
	return 0;
}

LL Find(LL p)
{
	int pre=0;
	while(p){
		a[pre++]=p%10;
		p/=10;
	}
	return DFS(pre-1,0,0,1);
}

LL DFS(int k,int mod,int boo,int bo)	//第k位,余数mod,boo是否有7,bo是否为p 
{
	LL ans=0;
	if(k==-1)	ans=(!mod)||boo;
	else	if(dp[k][mod][boo]!=-1&&!bo)	ans=dp[k][mod][boo];
	else{
		int pre=bo?a[k]:9;
		for(int i=0;i<=pre;++i)
			ans+=DFS(k-1,(mod*10+i)%7,boo||i==7,bo&&i==a[k]);
		if(!bo)	dp[k][mod][boo]=ans;
	}
	return ans;
}

E-Applese的超能力: https://www.nowcoder.com/acm/contest/190/E

思路:对于m个硬币可合成 1个硬币,最后要只剩一个硬币,由最后n=1个硬币往后推,n=1+(m-1)个硬币成立,再是1+(m-1)可当成1个硬币,则还需要6个硬币 n= 1+(m-1)+(m-1)也成立,则n=1+(m-1)*k时为Yes,否则为No

Code :

#include<iostream>
using namespace std;

int n,m;

int main()
{
	while(cin>>n>>m){
		bool boo=false;
		if(n==1||m!=1&&(n-1)%(m-1)==0)	boo=true;
		if(boo)	cout<<"Yes"<<endl;
		else	cout<<"No"<<endl;
	}
	return 0;
}

F-BFS:https://www.nowcoder.com/acm/contest/190/F

思路:真水题

Code:

#include<iostream>
using namespace std;

string str;

int main()
{
	while(cin>>str){
		int len=str.size();
		int boo=-1;
		for(int i=0;i<len-2;++i)
			if((str[i]=='B'||str[i]=='b')&&(str[i+1]=='O'||str[i+1]=='o')&&(str[i+2]=='B'||str[i+2]=='b')){
				boo=i;	break;
			}
		cout<<boo<<endl;
	} 
	
	return 0;
}

G-CSL分苹果:https://www.nowcoder.com/acm/contest/190/G

思路:背包DP,dp[i]=1表示 背包中有 i质量的苹果。则对于每个苹果质量x, 若dp[i]=1,则dp[i+x]=1;最后查找离所有苹果质量和一半sum/2最近的dp[i]=1即可

Code :

#include<iostream>
using namespace std;

const int MAX_N=100;
const int MAX_S=10005;
int n;
int dp[MAX_S];

int main()
{
	ios::sync_with_stdio(false);
	cin>>n;
	dp[0]=1;
	int sum=0;
	for(int i=1,x;i<=n;++i)
	{
		cin>>x;
		sum+=x;
		for(int j=MAX_S-x-1;j>=0;--j)
		{
			if(dp[j]){
				dp[j+x]=1;
			}
		}
	}
	int ans=0;
	for(int i=sum/2;i>=0;--i)
		if(dp[i]){
			ans=i;	break;
		}
	cout<<ans<<" "<<sum-ans<<endl; 
	
	return 0;
}

H-CSL的校园卡:https://www.nowcoder.com/acm/contest/190/H

思路:占坑。。

I-新建 Microsoft Office Word 文档:https://www.nowcoder.com/acm/contest/190/I

思路:利用优先队列Q来维护最小值,同时用数组boo[]来对已有文档序列做标记即可

Code:

#include<iostream>
#include<queue>
using namespace std;

const int MAX_N=100005;
int n,T;
string str;
priority_queue<int,vector<int>,greater<int> > Q;
bool boo[MAX_N];

int main()
{
	cin>>T;
	n=0;
	int x;
	while(T--){
		cin>>str;
		if(str=="New"){
			if(!Q.empty()){
				cout<<Q.top()<<endl;
				boo[Q.top()]=true;
				Q.pop();
			}else{
				boo[++n]=true;
				cout<<n<<endl;
			}
		}else{
			cin>>x;
			if(boo[x]){
				boo[x]=false;
				Q.push(x);
				cout<<"Successful"<<endl;
			}else	cout<<"Failed"<<endl;
		}
	}
	
	return 0;
}

J-方格填色:https://www.nowcoder.com/acm/contest/190/J

思路:占坑

猜你喜欢

转载自blog.csdn.net/C_13579/article/details/82719003