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

训练情况

赛后反思

C题没想明白,但是发现了数列一定是不增加的,另外第一次出现的数字,那个位置就必须是那个数字,剩下可能是乘法原理之类的东西吧,但是没做出来

A题

判断字符串第一位和最后一位是否一致即可

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

using namespace std;

void solve(){
    string s; cin>>s;
    int n = s.size();
    if(s[0] == s[n-1]) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}

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

B题

我们发现对于两个长度一样的队列,两个窗口会同时关掉,只需要判断数列中是否存在两个相同的元素即可

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

using namespace std;

void solve(){
    int n; cin>>n;
    map<int,int> v;
    bool flag = true;
    for(int i = 1;i<=n;i++){
        int x; cin>>x;
        v[x]++;
        if(v[x] == 2) flag = false;
    }
    if(flag) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}

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

C题

判断是否存在的方法同上题,想要全部拍照显然需要从队列人少的开始,按照队列人数从小到大的顺序拍照,所以我们结构体记录位置和人数,排序后输出即可

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

using namespace std;

struct node{
    int x,y;
};

bool cmp(node x,node y){
    return x.x > y.x;
}

void solve(){
    int n; cin>>n;
    vector<node> a(n + 1);
    map<int,int> v;
    bool flag = true;
    for(int i = 1;i<=n;i++){
        cin>>a[i].x;
        v[a[i].x]++;
        if(v[a[i].x] == 2) flag = false;
        a[i].y = i;
    }
    if(flag){
         cout<<"YES"<<endl;
         sort(a.begin() + 1,a.end(),cmp);
         for(int i = n;i;i--){
            cout<<a[i].y<<" ";
         }
    } else cout<<"NO"<<endl;
}

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

E题

首先我们考虑枚举 a,b 数列,位置 m 和 m + 1 的分界点,对于 a 数列求前缀 k 小数之和,对于 b 数列求后缀 k 小数之和,维护和我们考虑使用优先队列存当前最大的数,如果新的数小于最大的数,将最大的数替换成新数,使用堆维护这个操作,最后求出前后缀 k 小数和,遍历分界点答案取小值

点击查看代码
#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),b(n + 1);
    vector<int> pre(n + 1),suf(n + 1);
    for(int i = 1;i<=n;i++) cin>>a[i];
    for(int i = 1;i<=n;i++) cin>>b[i];
    priority_queue<int> s;
    int sum = 0;
    for(int i = 1;i<=k;i++) s.push(a[i]),sum += a[i];
    pre[k] = sum;
    for(int i = k+1;i<=n;i++){
        if(a[i] < s.top()){
            sum -= s.top();
            s.pop();
            s.push(a[i]);
            sum += a[i];
        }
        pre[i] = sum;
    }
    while(s.size()) s.pop();
    sum = 0;
    for(int i = n;i>=n-k+1;i--) s.push(b[i]),sum += b[i];
    suf[n-k+1] = sum;
    for(int i = n-k;i;i--){
        if(b[i] < s.top()){
            sum -= s.top();
            s.pop();
            s.push(b[i]);
            sum += b[i];
        }
        suf[i] = sum;
    }
    int ans = LONG_LONG_MAX;
    for(int i = k;i<=n-k;i++){
        // cout<<i<<" "<<pre[i]<<" "<<suf[i]<<endl;
        ans = min(ans,pre[i] + suf[i+1]);
    }
    cout<<ans<<endl;
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}
posted @   MNNUACM_2024ZY  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示