AtCoder Beginner Contest 328

A - Not Too Hard (atcoder.jp)

AC代码:

#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
const int N=10;
int s[N];
int n,x;
void solve() {
    cin>>n>>x;
    for(int i=1;i<=n;i++) cin>>s[i];
    int ans=0;
    for(int i=1;i<=n;i++){
        if(s[i]<=x) ans+=s[i];
    }
    cout<<ans<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

B - 11/11 (atcoder.jp)

直接暴力循环

AC代码:

#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
const int N=110;
int d[N];
int n;
void solve() {
    cin>>n;
    for(int i=1;i<=n;i++) cin>>d[i];
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=d[i];j++){
            string s=to_string(i)+to_string(j);
            bool ok=true;
            for(int k=1;k<(int)s.size();k++){
                if(s[k]!=s[k-1]){
                    ok=false;
                    break;
                }
            }
            if(ok) ans++;
        }
    }
    cout<<ans<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

C - Consecutive (atcoder.jp)

利用前缀和的思想,快速统计某区间满足题意的p的个数

AC代码:

#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
const int N=3e5+10;
int pre[N];
int n,q;
string s;
void solve() {
    cin>>n>>q;
    cin>>s;
    s=' '+s;
    pre[1]=1;
    for(int i=2;i<=n;i++){
        if(s[i]==s[i-1]) pre[i]=pre[i-1]+1;
        else pre[i]=pre[i-1];
    }
    for(int i=0;i<q;i++){
        int l,r;
        cin>>l>>r;
        cout<<pre[r]-pre[l]<<endl;
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

D - Take ABC (atcoder.jp)

利用string的find函数和erase函数

 

超时代码:

#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
string s;
void solve() {
    cin>>s;
    auto pos=s.find("ABC");
    if(pos==s.npos){
        cout<<s<<endl;
        return;
    }
    while(pos!=s.npos){
        s.erase(s.begin()+pos,s.begin()+pos+3);
        pos=s.find("ABC");
    }
    cout<<s<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

糊涂了,这题很明显用栈的

然后还是错,想的是判断栈顶是A,然后后面两个字符分别是B和C,但是如果栈里面存的是A和B,然后删了一个ABC之后,下一个刚好是B的话就错了

#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
string s;
stack<char>q;
void solve() {
    cin>>s;
    int n=s.size();
    s+='X';
    for(int i=0;i<n;i++){
        if(q.size()&&q.top()=='A'&&s[i]=='B'&&s[i+1]=='C') q.pop(),i++;
        else q.push(s[i]);
     }
    string tmp="";
    while(q.size()){
        tmp=q.top()+tmp;
        q.pop();
    }
    cout<<tmp<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

如果是存字符的话,可以用string代替栈,每插入一个字符,就判断最后三个字符是否是ABC,也可以用vector代替栈,好处是不仅可以知道栈顶,即最后一个元素,还可以知道倒数第二个,第三个...

AC代码:

#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
string s;
void solve() {
    cin>>s;
    string tmp="";
    for(int i=0;i<(int)s.size();i++){
        tmp.push_back(s[i]);
        if(tmp.size()>=3&&tmp[tmp.size()-3]=='A'&&tmp[tmp.size()-2]=='B'&&tmp[tmp.size()-1]=='C'){
            tmp.pop_back();
            tmp.pop_back();
            tmp.pop_back();
        }
    }
    cout<<tmp<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值