Codeforces Round 966 (Div. 3) A-D

A. Primary Task


思路:

就是10的几次方,看前两位是10,然后判断次数是否合法就行了

#include<bits/stdc++.h>
using namespace std;

#define fir first
#define sec second
#define endl "\n"   

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
const int N = 1e5 + 10, M = N * 2, mod = 1e9 + 7, inf = 0x3f3f3f3f, P = 131;

void solve()
{
    string s;
    cin >> s;
    if(s[0]=='1' && s[1]=='0'){
        int cnt=0;
        if(s[2]!='0'){
            for(int i=2;i<s.size();i++){
                    cnt *= 10;
                    cnt += s[i]-'0';
                }
                if(cnt>=2){
                    cout<<"YES"<<endl;
                    return;
                }
            }
    }
    cout<<"NO"<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int t = 1;
    cin >> t;
    while(t --)
        solve();

    return 0;
}

B. Seating in a Bus:



思路:

翻译的很抽象,简说一下,第一位乘客随便坐,后面的乘客所带的编号+1或者-1有人才可以坐,一次类推,开个set看长度就行了,长度一样证明都坐下了

#include<bits/stdc++.h>
using namespace std;

#define fir first
#define sec second
#define endl "\n"   

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
const int N = 2e5 + 10, M = N * 2, mod = 1e9 + 7, inf = 0x3f3f3f3f, P = 131;
void solve()
{
    int n;
    cin >> n;
    set<int>st;
    int tp;
    for(int i=1;i<=n;i++){
        cin >> tp;
        if(i==1) st.insert(tp);
        else{
            if(st.count(tp+1)||st.count(tp-1))//判断上下是否有人
                st.insert(tp);
        }
    }
    if(st.size()==n) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int t = 1;
    cin >> t;
    while(t --)
        solve();

    return 0;
}

C. Numeric String Template



思路:

对应的字母和数字相等即可,但是会有坑

#include<bits/stdc++.h>
using namespace std;

#define fir first
#define sec second
#define endl "\n"   

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
const int N = 2e5 + 10, M = N * 2, mod = 1e9 + 7, inf = 0x3f3f3f3f, P = 131;
int a[N];
void solve()
{
    int n;
    cin >> n;
    for(int i=0;i<n;i++)
        cin >> a[i];
    int m;
    cin>>m;
    while(m--){
        string s;
        cin >> s;
        int f=1;
        map<char,int> mp;
        map<int,char> mpp;
        if(s.size()>n || s.size()<n) cout<<"NO"<<endl;
        else{

            for (int i=0;i<n;i++) {
                char ts=s[i];
                int ta=a[i];
                if (mp.find(ts)!=mp.end()) {//如果有这个字符对应的下标
                    if (mp[ts]!=ta) {//如果不等就打个0的标记
                        f=0;
                        break;
                    }
                } 
                else{
                    int f1=0;
                    for (const auto& v:mp) {//这就是坑的所在地方
                        if (v.sec==ta) {
                            f1=1;
                            break;
                        }
                    }
                    if (f1){
                        f=0;
                        break;
                    }
                    mp[ts]=ta;
                }
            }
        if(f) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int t = 1;
    cin >> t;
    while(t --)
        solve();

    return 0;
}

D. Right Left Wrong


思路:

求区间和,用前缀和,这个题实际是双指针来找区间,以最好一个样例为例子,LRLRR,令l=0,r=n-1,第一对LR为 l=0,r=n-1,求一次和,第二对LR为l=2,r=n-2,再求一次和就是15+7=22;

#include<bits/stdc++.h>
using namespace std;

#define fir first
#define sec second
#define endl "\n"   

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
const int N = 2e5 + 10, M = N * 2, mod = 1e9 + 7, inf = 0x3f3f3f3f, P = 131;
ll a[N],sum[N];
void solve()
{
    int n;
    cin >> n;
    for(int i=1;i<=n;i++){
        cin >> a[i];
        sum[i]=sum[i-1]+a[i];
    }
    string s;
    cin >> s;
    int l=0,r=n-1;
    ll ans=0;
    while (l<r) {
        if (s[l]=='L' && s[r]=='R') {
                ans+=sum[r+1]-sum[l];
                l++;
                r--;
            }
        else if (s[l]=='L') {
                while (l<r &&s[r]!='R') {
                    r--;
                }
                if (l<r) {
                    ans+=sum[r+1]-sum[l];
                    l++;
                    r--;
                }
            } 
//下面两种情况可参考样例三,实际上就是让它自己动
        else if (s[r]=='R') {
                while (l<r && s[l]!='L') {
                    l++;
                }
                if (l<r) {
                    ans+=sum[r+1]-sum[l];
                    l++;
                    r--;
                }
            } else {
                l++;
                r--;
            }
        }
    cout<<ans<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int t = 1;
    cin >> t;
    while(t --)
        solve();

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值