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

A.

直接计算

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f


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(0);cout.tie(0);
    int left=1;
    //cin>>left;
    while(left--){
        solve();
    }
}

B.

事实上操作次数是固定的,就是数-1
所以计算出操作次数和,若是奇数就是先手赢

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f


void solve() {
    int n;cin>>n;
    vector<int>a(n+1);
    for(int i=1;i<=n;i++)cin>>a[i];
    int cnt=0;
    for(int i=1;i<=n;i++)cnt+=a[i]-1;
    if(cnt&1)cout<<"gui";
    else cout<<"sweet";
}

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

C.

可以直接模拟

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

char g[110][110];
void solve() {
    int n,m,x,y;cin>>n>>m>>x>>y;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>g[i][j];
        }
    }
    int p,q;cin>>p>>q;
    vector<pair<int,int>>v(q+1);
    for(int i=1,op,z;i<=q;i++){
        cin>>op>>z;
        if(op==1){
            v[i].first=1;v[i].second=z;
        }else{
            v[i].first=2;v[i].second=z;
        }
    }
    for(int i=1;i<=p;i++){
        for(int j=1;j<=q;j++){
            int op=v[j].first,z=v[j].second;
            if(op==1){
                for(int k=m;k>=1;k--){
                    g[z][k+1]=g[z][k];
                }
                g[z][1]=g[z][m+1];
            }else{
                for(int k=n;k>=1;k--){
                    g[k+1][z]=g[k][z];
                }
                g[1][z]=g[n+1][z];
            }
        }
    }
    cout<<g[x][y];
}

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

D.

相当于自己构造,满足每个数至少为1
我们直接暴力枚举最大公约数
先求出总和,然后把每个数赋值为枚举的数,总和-已经赋值的,
剩下的若是枚举的数的倍数,则枚举数合法

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int n;cin>>n;
    vector<int>a(n+1);
    int sum=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    if(n==1){
        cout<<1;return ;
    }
    int ans=1;
    for(int i=2;i<=200000;i++){
        if(n*i<=sum){
            int tmp=sum-n*i;
            if(tmp==0)ans++;
            else if(tmp%i==0)ans++;
        }else break;
    }
    cout<<ans;
}

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

G.

可以直接模拟,要用前缀和优化

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

char g[510][510];
int pre[510][510];
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];
            if(g[i][j]=='*')pre[i][j]=pre[i][j-1]+1;
            else pre[i][j]=pre[i][j-1];
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(g[i][j]=='*'){
                //cout<<"ij="<<i<<' '<<j<<'\n';
                for(int k=1;i+k<=n;k++){
                    int l=j-k,r=j+k;
                    if(l<1||r>m||g[i+k][l]=='.'||g[i+k][r]=='.'){
                        //cout<<"&&&\n";
                        break;
                    }
                    if(pre[i+k][r]-pre[i+k][l-1]==r-l+1)ans++;
                }
            }
        }
    }
    cout<<ans;
}

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

E.

设a%k=b,那么(a+k)%k=b
前缀和处理这个过程

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int n,k;cin>>n>>k;
    vector<int>a(n+1),pre(n+1,0);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        pre[i]=pre[i-1]+a[i];
    }
    set<int>st;
    int ans=0;
    for(int i=1;i<=n;i++){
        st.insert(pre[i-1]%k);
        if(st.count(pre[i]%k)){
            ans++;
            st.clear();
        }
    }
    cout<<ans;
}

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

posted @ 2024-02-20 14:54  WW爆米花  阅读(4)  评论(0编辑  收藏  举报