牛客周赛 Round 65 个人题解(A~G)

牛客周赛 Round 65 个人题解

牛客周赛 Round 65

A-超市_牛客周赛 Round 65

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void solve(){
	int n,a,b;cin>>n>>a>>b;
	int ans=0;
	for(int i=0;i<=100;i++){
		for(int j=0;j<=100;j++){
			if(i*a+j*b<=n){
				ans=max(ans,i+j);
			}
		}
	}
	cout<<ans<<endl;
}
int main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
	while(T--) solve();
	return 0;
}

B-雨幕_牛客周赛 Round 65

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
char g[1010][1010];
void solve(){
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>g[i][j];
		}
	}
	int ans=0;
	for(int i=1;i<=n-1;i++){
		for(int j=1;j<=m-1;j++){
			if(g[i][j]=='*' && g[i][j+1]=='*' && g[i+1][j]=='*' && g[i+1][j+1]=='*'){
				ans++;
			}
		}
	}
	cout<<ans<<endl;
}
int main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
	while(T--) solve();
	return 0;
}

C-闺蜜_牛客周赛 Round 65

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1010;
int a[N];
void solve(){
	int n;cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+n+1);
	int sum1=0,sum2=0;
	swap(a[1],a[n]);
	for(int i=n;i>=1;i--){
		if(i%2==0){
			sum1+=a[i];
		}
		else{
			sum2+=a[i];
		}
	}
	if(sum1>sum2) cout<<"kou"<<endl;
	else if(sum1<sum2) cout<<"yukari"<<endl;
	else cout<<"draw"<<endl;
}
signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T;cin>>T;
	while(T--) solve();
	return 0;
}

D-医生_牛客周赛 Round 65

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e5+10;
int a[N],b[30],pw[30];
struct node{
	int v,cnt;
}c[N];
void init(){
	pw[0]=1;
	for(int i=1;i<=30;i++){
		pw[i]=pw[i-1]*2;
	}
}
void solve(){
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;i++){
		string s;cin>>s;
		int len=s.size();
		s=" "+s;
		int cnt=0;
		int num=0;
		for(int i=len;i>=1;i--){
			num+=(s[i]-'0')*pw[cnt];
			cnt++;
		}
		a[i]=num;
	}
//	for(int i=1;i<=n;i++) cout<<a[i]<<endl;
	int k;cin>>k;
	for(int i=1;i<=k;i++){
		string s;cin>>s;
		int len=s.size();
		s=" "+s;
		int cnt=0;
		int num=0;
		for(int i=len;i>=1;i--){
			num+=(s[i]-'0')*pw[cnt];
			cnt++;
		}
		b[i]=num;
	}
	int tot=0;
	int maxn=pw[k]-1;
	// for(int i=1;i<=k;i++) cout<<b[i]<<" ";
	// cout<<endl;
	for(int i=0;i<=maxn;i++){
		int num=0;
		int cnt=0;
		for(int j=0;j<=k-1;j++){
			if((i>>j)&1ll){
				num|=b[j+1];
				cnt++;
			}
		}
		c[++tot]={num,cnt};
	}
	// for(int i=1;i<=tot;i++) cout<<c[i].v<<endl;
	// cout<<endl;
	for(int i=1;i<=n;i++){
		int ans=1e9;
		for(int j=1;j<=tot;j++){
			if((a[i]&c[j].v)==a[i]){
				ans=min(ans,c[j].cnt);
			}
		}	
		if(ans==1e9) cout<<-1<<endl;
		else cout<<ans<<endl;
	}
}
signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	init();
	int T=1;
	while(T--) solve();
	return 0;
}

E-降温(easy)_牛客周赛 Round 65

解题思路

  • 考虑贪心,要求最大值时,每一个问号都应该尽可能降低温度,所以a[i]=a[i-1]-x,但是如果超过了最小值,那么a[i]已无法提供一次贡献,那么则将a[i]设置为最大值maxn,让他为后面做贡献
  • 要求最小值时只需令a[i]=a[i-1]-x+1即可
  • E,F同理,仅有数据范围的差别
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
int a[110],b[110];
void solve(){
	int n,x;cin>>n>>x;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	int maxn=50,minn=-50,vis=-999;
	int ans1=0,ans2=0;
	for(int i=1;i<=n;i++){
        if(i==1){
            if(a[i]==vis) a[i]=maxn;
            continue;
        }
        if(a[i]!=vis){
            if(a[i-1]-a[i]>=x) ans1++;
        }
        else{
            if(a[i-1]-x>=minn){
                a[i]=a[i-1]-x;
                ans1++;
            }
            else a[i]=maxn;
        }
    }
    for(int i=1;i<=n;i++){
    	if(i==1){
    		if(b[i]==vis) b[i]=minn;
    		continue;
    	}
    	if(b[i]!=vis){
    		if(b[i-1]-b[i]>=x) ans2++;
    	}
    	else b[i]=max(minn,b[i-1]-x+1);
    }
	cout<<ans1<<" "<<ans2<<endl;
}
int main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
	while(T--) solve();
	return 0;
}

F-降温(hard)_牛客周赛 Round 65

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e5+10;
int a[N],b[N];
void solve(){
	int n,x;cin>>n>>x;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	int maxn=5e8,minn=-5e8;
	int vis=-1*(int)999999999;
	int ans1=0,ans2=0;
	for(int i=1;i<=n;i++){
        if(i==1){
            if(a[i]==vis) a[i]=maxn;
            continue;
        }
        if(a[i]!=vis){
            if(a[i-1]-a[i]>=x) ans1++;
        }
        else{
            if(a[i-1]-x>=minn){
                a[i]=a[i-1]-x;
                ans1++;
            }
            else a[i]=maxn;
        }
    }
    for(int i=1;i<=n;i++){
    	if(i==1){
    		if(b[i]==vis) b[i]=minn;
    		continue;
    	}
    	if(b[i]!=vis){
    		if(b[i-1]-b[i]>=x) ans2++;
    	}
    	else b[i]=max(minn,b[i-1]-x+1);
    }
	cout<<ans1<<" "<<ans2<<endl;
}
signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
	while(T--) solve();
	return 0;
}

G-乌鸦_牛客周赛 Round 65

解题思路

  • 构造题,相邻位置只能相差1,那我们不妨假设一开始构造101010101即奇数位放一,或者0101010101即偶数位放一
  • 当第一层搭好后,我们不难发现,接下来相当于要每次添加一个1x2的砖块,并且一定是1x2的,如果打好第一层后的砖块数量不能满足为偶数的话,即输出-1
  • 那么我们可以先循环的放n轮全放的(这意味着n轮结束后顶部情况会和第一层情况保持一致),然后我们只需对剩下的砖块进行摆放即可。
  • 为了方便判断,此处给出两种地基的实现方式都进行计算,如有一种满足即可。
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e5+10;
int n,m;
int a[N];
bool flag=0;
//初始1 3 5 7奇数位放一
void work1(){
	vector<int> a(n+1,0);
	int res=m;
	for(int i=1;i<=n;i+=2){
		a[i]++,res--;
	}
	if(res<0 || res%2==1) return;
	res/=2;
	int round=res/n;
	res%=n;
	for(int i=2;i<=n;i+=2){
		if(res<=0) break;
		a[i]+=2,res--;
	}
	for(int i=1;i<=n;i+=2){
		if(res<=0) break;
		a[i]+=2,res--;
	}
	flag=1;
	for(int i=1;i<=n;i++) a[i]+=round*2;
	for(int i=1;i<=n;i++) cout<<a[i]<<" ";
	cout<<endl;
}
//初始2 4 6 8偶数位放一
void work2(){
	vector<int> a(n+1,0);
	int res=m;
	for(int i=2;i<=n;i+=2){
		a[i]++,res--;
	}
	if(res<0 || res%2==1) return;
	res/=2;
	int round=res/n;
	res%=n;
	for(int i=1;i<=n;i+=2){
		if(res<=0) break;
		a[i]+=2,res--;
	}
	for(int i=2;i<=n;i+=2){
		if(res<=0) break;
		a[i]+=2,res--;
	}
	flag=1;
	for(int i=1;i<=n;i++) a[i]+=round*2;
	for(int i=1;i<=n;i++) cout<<a[i]<<" ";
	cout<<endl;
}
void solve(){
	cin>>n>>m;
	work1();
	if(!flag) work2();
	if(!flag) cout<<-1<<endl;
}
signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
	while(T--) solve();
	return 0;
}

posted @ 2024-11-02 10:53  Persona_owl  阅读(29)  评论(0编辑  收藏  举报