AtCoder Beginner Contest 158

A

按题意乱搞

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;

signed main() {
    string str;
    cin>>str;
    if(str=="AAA" || str=="BBB") puts("No");
    else puts("Yes");
}

B

老套的题目,按余数讨论即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;

signed main() {
    int n,a,b;
    cin>>n>>a>>b;
    int ans=n/(a+b)*a;
    int r=n%(a+b);
    if(r>a) ans+=a;
    else ans+=r;
    cout<<ans;
}

C

找到答案的可能区间然后找最小数即可,注意不要使用浮点

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;

signed main() {
    int a,b;
    cin>>a>>b;
    int l=max(10*b,(25*a+1)/2);
    int r=min(10*b+10,(25*a+25+1)/2);
    int L=l+0.1,R=r+0.1;
    if(L<R) cout<<L;
    else cout<<-1;
}

D

维护头尾两个栈和一个翻转标记

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;

string str;
vector <char> v[2];
int fg=0;
int q;
int t1,t2;

signed main() {
    ios::sync_with_stdio(false);
    cin>>str;
    cin>>q;
    for(int i=1;i<=q;i++) {
        cin>>t1;
        if(t1==1) {
            fg^=1;
        }
        else {
            cin>>t2;
            char ch;
            cin>>ch;
            if(t2==1) {
                v[fg].push_back(ch);
            }
            else {
                v[fg^1].push_back(ch);
            }
        }
    }
    if(fg==0) {
        while(v[0].size()) cout<<v[0].back(), v[0].pop_back();
        cout<<str;
        for(char c:v[1]) cout<<c;
    }
    else {
        while(v[1].size()) cout<<v[1].back(), v[1].pop_back();
        reverse(str.begin(),str.end());
        cout<<str;
        for(char c:v[0]) cout<<c;
    }
}

E

如果 \((p,10)=1\),那么如果一个答案 \(k\) 不是 \(p\) 的倍数, \(10^rk\) 也不是,因此直接处理出大数的带位权前缀和,然后暴力数出 \(\bmod p\) 后各余数对应的端点有多少个来计算区间数即可

否则,\(p=2\)\(p=5\),根据初等数论的结论,这两个数字的整除性可以根据尾数判断

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;

int n,c[10005],p,a[N],s[N],pw[N],ans;
char str[N];

signed main() {
    cin>>n>>p>>str+1;
    for(int i=1;i<=n;i++) a[i]=str[i]-'0';
    if(__gcd(p,10ll)==1) {
        pw[0]=1;
        for(int i=1;i<=n;i++) pw[i]=pw[i-1]*10%p;
        for(int i=1;i<=n;i++) s[i]=(s[i-1]+pw[n-i]*a[i])%p;
        for(int i=0;i<=n;i++) c[s[i]]++;
        for(int i=0;i<p;i++) ans+=c[i]*(c[i]-1)/2;
        cout<<ans;
    }
    else if(p==2) {
        for(int i=1;i<=n;i++) if(a[i]%2==0) ans+=i;
        cout<<ans;
    }
    else if(p==5) {
        for(int i=1;i<=n;i++) if(a[i]%5==0) ans+=i;
        cout<<ans;
    }
}

F

待填坑

猜你喜欢

转载自www.cnblogs.com/mollnn/p/12440960.html