【无标题】The 8th Hebei Collegiate Programming Contest题解

A.Update

全局替换功能是一个十分好用的功能。使用这个功能,你可以轻松地在编辑器中对字符串进行修改。 Iris 是一只可爱的猫猫,她用爪子在 oql 的键盘上胡乱敲了若干次,刚好形成了一个仅由小写字母组成 的字符串。 oql 特别喜欢 i 这个字母,他想把这个字符串中的所有字母都变成 i,并准备进行如下操作若干次(也 有可能一次都不用操作): • 选择两个 a ~ z的字母 x, y,将字符串中所有的 x 全部同时替换成 y。 oql 想知道,至少要用多少次操作才能把所有字符都变成 i。

注释:只要把要换的种类记一下即可(set最方便了)

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define N 200010
int n,m,a[N];
map<int,int> q;
void cb(){
    string s;cin>>s;
    map<char,int>mp;
    int ans=0;
    for(int i=0;i<s.size();i++){
        if(!mp[s[i]]&&s[i]!='i')ans++;
        mp[s[i]]++;
    }
    cout<<ans<<endl;
}
signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int t;t=1;
    while(t--)cb();
    return 0;
}

K. Welcome

输出即可

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define N 200010
int n,d,h,a[N],ans=-1;
map<int,int> q;
void cb(){
    cout<<"HBCPC2024";
}
signed main(){
    int t;t=1;
    while(t--)cb();
    return 0;
}
C. Goose Goose Duck

Iris 有 n 个喜欢玩鹅鸭杀的朋友,编号为 1 ∼ n。 假期的时候,大家经常会在群里问有没有人玩鹅鸭杀,并且报出现在已经参与的人数。 但是每个人对于当前是否加入游戏都有自己的想法。 具体的来说,对于第 i 个人,如果当前已经加入游戏的人数处于区间 [li , ri ] 之间,那 ta 就会愿意加入游 戏。 你认为参与游戏的人越多,游戏将会越有趣,所以你决定给大家安排一个加入顺序,使得加入游戏的人 数最多。

注释:用小根堆写首先先推入判断l<r再记录这个下标,最后输出即可;

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,a[N];
#define P pair<int,int>
vector<P> e[N];
void cb(){
    cin>>n;
    priority_queue<P,vector<P>,greater<P>>q;
    vector<int> ans;
    for(int i=1;i<=n;i++){
        int l,r;cin>>l>>r;
        e[l].push_back({r,i});
    }
    for(int i=1;i<=n;i++){
        for(auto w:e[i-1])q.emplace(w);
        while(!q.empty()&&q.top().first<i-1)q.pop();
        if(q.empty())break;
        ans.push_back(q.top().second);
        q.pop();
    }
    cout<<ans.size()<<'\n';
    for(auto x:ans)cout<<x<<' ';
}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int t;t=1;
    while(t--)cb();
    return 0;
}

I. Subnet Iris

刚刚学习了关于 IPv4 子网的知识。 现在,给定一个子网和若干 IP 地址,请你帮 Iris 判断每一个地址是否属于这个子网。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
#define P pair<int,int>
using ll=long long;
const int mod=1e6+3;
int zi_num[5],cnt,ip_num[5],cnt2;
vector<P> e[N];
void cb(){
    string zi;cin>>zi;
    int net_len=0;
    for(int i=0;i<zi.size();++i){
        if(zi[i]=='.')cnt++;
        else if(zi[i]=='/'){
            for(int j=i+1;j<zi.size();++j){
                net_len=net_len*10+zi[j]-'0';
            }
            break;
        }
        else zi_num[cnt]=zi_num[cnt]*10+zi[i]-'0';
    }
    int n;cin>>n;
    int last=net_len%8,com=net_len/8;
    while(n--){
        cnt=0;cnt2=0;
        memset(ip_num,0,sizeof ip_num);
        string ip;cin>>ip;
        for(int i=0;i<ip.size();++i){
            if(ip[i]=='.')cnt2++;
            else ip_num[cnt2]=ip_num[cnt2]*10+ip[i]-'0';
        }
        bool flag=true;
        for(int i=0;i<com;++i){
           if(ip_num[i]!=zi_num[i]){
               flag=false;
               break;
           }
        }
        if(flag&&last){
            for(int i=8;i>=(8-last);--i){
                if((ip_num[com]>>i)!=(zi_num[com]>>i)){
                    flag=false;
                    break;
                }
            }
        }
        if(flag)cout<<"YES\n";
        else cout<<"NO\n";
    }
}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int t;t=1;
    while(t--)cb();
    return 0;
}

G. Bracelet oql

有若干个形如 00,01,11 的珠子,喜欢做手工的 oql 希望把他们串成一个手链,他精心设计了手链 的样式并绘出了图纸。 手链的样式可以抽象为一个由 0 和 1 组成的字符串 S,且首尾相接。 但是此时路过了一只叫 Iris 的猫猫,现在三种珠子分别只剩下 n, m, k 个了。 oql 很伤心,但是还是决定努力完成手链,至少完成手链的连续一部分,他想知道自己现在能完成的最 长连续部分的长度是多少。 显然,你不应该破坏珠子。不过,你可以翻转珠子,对于 00 和 11,翻转之后没有变化,对于 01,翻转 之后变为 10。

注释:先把成环的字符串再重复加一下即可解决这个麻烦,再用双指针去遍历条件,ans记录最大值。

#include<bits/stdc++.h>
using namespace std;
void cb(){
    int ans[3]{};
    for(int i=0;i<3;++i)cin>>ans[i];
    string a;cin>>a;
    int n=a.size();
    a+=a;
    int res=0;
    for(int s=0;s<2;++s){
        int cur[3]{ans[0],ans[1],ans[2]};
        for(int i=s,j=s;i<n;i+=2){
            while(j+2<=n+i&&cur[a[j]-'0'+a[j+1]-'0']){
                cur[a[j]-'0'+a[j+1]-'0']--;
                j+=2;
            }
            res=max(res,j-i);
            cur[a[i]-'0'+a[i+1]-'0']++;
        }
    }
    cout<<res;
}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int t;t=1;
    while(t--)cb();
    return 0;
}

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值