2024牛客寒假算法基础集训营4

2024牛客寒假算法基础集训营4

比赛地址

A.柠檬可乐

思路:

简单的模拟,按照题目描述判断大小即可

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()

void solve(){
	int a,b,k;
	cin>>a>>b>>k;
	if(a>=k*b) cout<<"good";
	else cout<<"bad";
	
	
}

signed main(){
	ios::sync_with_stdio(false); cin.tie(nullptr);
	int t=1;
	// cin>>t;
	
	while(t--){
		solve();
	}
	return 0;

}

B.左右互博

思路

讨厌鬼和小甜妹都是采用的最佳策略,这里我认为最佳策略就是每次分裂都必须有一个1,这样我们就保证了其中一个是无法继续分裂的,因此我们只要将所有不为1的数字加在一起就可以了

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()

void solve(){
    int n; cin>>n;
    std::vector<int> a(n+1);
    int ans=0;

    for(int i=1;i<=n;i++){
        cin>>a[i];
        ans+=(a[i]-1);
    }
    if(ans%2){
        cout<<"gui"<<endl;

    }
    else{
        cout<<"sweet"<<endl;
        
    }

    
}

signed main(){
    ios::sync_with_stdio(false); cin.tie(nullptr);
    int t=1;
    // cin>>t;
    
    while(t--){
        solve();
    }
    return 0;

}

C.冬眠

思路

按理说模拟即可,大家可以去试试,后续补题有点发懒了,所以就没有认真看看

Code

#include<bits/stdc++.h>

using namespace std;
const int N = 110;
int n,m,x,y  ; 
char a[N][N];
int p,q;
int op[110] , z[110];

int  main()
{
    cin >> n >> m >> x >> y;
    for(int i = 1 ; i <= n ; i ++) 
    {
        for(int j = 1 ; j <= m ; j ++)   
        {
            cin >> a[i][j];
        }
    }
    cin >> p >> q;
    for(int i = 1 ; i <= q ; i++) cin >> op[i] >> z[i];
    while(p --)
    {
        for(int i = 1 ; i <= q ; i ++)
        {
            if(op[i] == 1)
            {
                for(int j = m ; j >= 1 ; j --) a[z[i]][j+1] = a[z[i]][j];
                a[z[i]][1] = a[z[i]][m+1];
            }
            if(op[i] == 2)
            {
                for(int j = n ; j >= 1 ; j --) a[j+1][z[i]] = a[j][z[i]];
                a[1][z[i]] = a[n+1][z[i]];
            }
        }
    }
    cout<<a[x][y];
}

D.守恒

思路

数组a可以进行任意次操作,因为是一个数+1,一个数-1,所以总和其实一直没有变,这里就可以呃理解为,总和的因子乘以数组的长度是不是小于等于数组的总和(好吧,这里说的有点绕)

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()


void solve(){
    int n; cin>>n;

    std::vector<int> a(n+1);
    for(int i=1;i<=n;i++) cin>>a[i];
    int ans=0;
    for(int i=1;i<=n;i++){
        ans+=a[i];
    }
    int res=0;
    if(n==1){
        cout<<1<<endl;
        return ;

    }
    else{
        // int up1=sqrt(ans)+1;
        for(int i=1;;i++){
            if(ans/i<n){
                break;
            }
            if(ans%i==0){
                res++;
            
            }
        }
    }

    cout<<res<<endl;
    
}

signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr), std::cout.tie(nullptr);
    // ios::sync_with_stdio(false); cin.tie(nullptr);
    int t=1;
    // cin>>t;
    
    while(t--){
        solve();
    }
    return 0;

}

E.漂亮数组

思路

这应该是一个贪心题,我们如何去找是k的倍数的一个子数组呢,事实上这一步就需要用到前缀和思想,我们将给定的数组进行前缀和处理,方便后续的使用,之后我们找到两个前缀和余数相同的地方,那么以这两个位置中间的子数组就是一个漂亮数组,但是我们需要保证的是靠左的那个位置应该是要比我们之前已经分好的位置要大,不然也会影响到之前我们分好的数组,这里我用的map,但是用set也是可以的

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()

void solve(){
    int n,k; cin>>n>>k;
    std::vector<int> a(n+1);
    std::vector<int> s(n+1,0);
    std::map<int, int> mp;
    mp[0]=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        s[i]=s[i-1]+a[i];
    }
    int ans=0;
    int pre=-1;

    for(int i=1;i<=n;i++){
        if(mp.count(s[i]%k)&&mp[s[i]%k]>=pre){
            ans++;
            pre=i;
        }
        mp[s[i]%k]=i;
    }
    cout<<ans<<endl;
    
}

signed main(){

    int t=1;
    while(t--){
        solve();
    }
    return 0;
}
posted @ 2024-02-21 12:16  du463  阅读(13)  评论(0编辑  收藏  举报