【牛客训练记录】牛客周赛 Round 78

训练情况

赛后反思

C题犯蠢,实则行操作会影响到其他列,所以只需要判断列相同的个数最大值就是答案,D题看错题的情况下A了

A题

第二场已经举行,第三场还没举行,\(\ge 3\) 答案是 NO,否则就是 YES

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    int x; cin>>x;
    if(x>=3) cout<<"NO"<<endl;
    else cout<<"YES"<<endl;
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

B题

构造一个排列,使得连续 \(k\) 个元素都不是排列,我们考虑如下一种构造

1 7 2 6 3 5 4

从左到右奇数位,再到从右到左偶数位

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    int n; cin>>n;
    int ans[n+1];
    int tot = 0;
    for(int i = 1;i<=n;i++){
        if(i&1) ans[i] = ++tot;
    }
    for(int i = n;i;i--){
        if(i%2==0) ans[i] = ++tot;
    }
    for(int i = 1;i<=n;i++) cout<<ans[i]<<" ";
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

C题

我们发现改变一行一定会影响到答案,对于两个列,如果相同一定能通过相同的行变换得来的,所以这题只需要统计最大的相同列个数,我们用map维护最大值即可

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    int n,m; cin>>n>>m;
    vector<string> s(n);
    map<string,int> v;
    int ans = 0;
    for(int i = 0;i<n;i++) cin>>s[i];
    for(int i = 0;i<m;i++){
        string a;
        for(int j = 0;j<n;j++){
            a+=s[j][i];
        }
        v[a]++;
        ans = max(ans,v[a]);
    }
    cout<<ans<<endl;
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

D题

我们发现想让答案最大,正贡献一定要操作,想让答案最小,负贡献一定要操作,所以最后等效于区间全部操作一遍,答案就是 \(k \sum{a_i}\)

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;

void solve(){
    int n,k; cin>>n>>k;
    vector<int> a(n + 1);
    int sum = 0;
    for(int i = 1;i<=n;i++) cin>>a[i],sum+=a[i];
    if(k==0){
        cout<<0<<endl;
        return;
    }
    cout<<sum*k<<endl;
}

signed main(){
    int T; cin>>T; while(T--)
    solve();
    return 0;
}
posted @ 2025-01-25 21:47  MNNUACM_2024ZY  阅读(57)  评论(0)    收藏  举报