Codeforces Round 964 (Div. 4) ABCDE题解

A-A+B Again?

思路:输入的是一个两个字符的字符串,拆成两个数再相加就好了

AC代码:

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

void solve(){
    string s;
    cin>>s;
    int a = s[0]-'0';
    int b = s[1]-'0';
    cout<<a+b<<endl;
}

int main(){
    int t=1;
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

B - Card Game

思路:四个数 a,b,c,d 分成 ac和bd ad和bc两种情况 每种情况里面又分两种情况, 因为顺序不用管, 所以一种大情况成立 cnt+=2

AC代码:

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

void solve(){
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    int cnt = 0;
    if((a>c && b>=d) || (b>d && a>=c)) cnt+=2;
    if((a>d && b>=c) || (b>c && a>=d)) cnt+=2;
    cout<<cnt<<'\n';
}

int main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t=1;
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

C - Showering

思路:因为给出的时间段不会重叠,所以使用 vector<pair<int,int> >来存,之后在sort排序一下,特判首尾两端之后再遍历中间,看有没有足够洗澡的时间段即可

AC代码:

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

void solve(){
    int n,xi,m;
    cin>>n>>xi>>m;
    vector<pair<int,int> > mask(n);
    int a,b;
    for(int i=0;i<n;i++){
        cin>>a>>b;
        mask[i]={a,b};
    }
    sort(mask.begin(),mask.end());
    if(mask[0].first-0>=xi){ cout<<"Yes\n"; return ;}
    if(m-mask[n-1].second>=xi){cout<<"Yes\n"; return ;}
    for(int i=1;i<n;i++){
        if(mask[i].first-mask[i-1].second>=xi){cout<<"Yes\n"; return ;}
    }
    cout<<"No\n";
}

int main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t=1;
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

D - Slavic's Exam

思路:双指针,一个指着s,一个指着t,遇到‘?’就将t指着的字符赋给它,若之后还剩多的‘?‘ 就全部换成A即可,若t的指针最后指不到t的末尾,说明t不是从s中可以得到的字串,输出NO

AC代码:

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

void solve(){
   string s,t;
   cin>>s;
   cin>>t;
   int tzhi = 0;
   for(int i=0;i<s.size();i++){
      if(s[i]==t[tzhi] || s[i]=='?'){
        if(s[i]=='?') s[i]=t[tzhi];
        tzhi++;
      }
      if(tzhi == t.size()){
        for(int j=i;j<s.size();j++){
            if(s[j]=='?') s[j]='a';
        }
        cout<<"YES\n";
        cout<<s<<'\n';
        return ;
      }
   }
   cout<<"NO\n";
}

int main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t=1;
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

E - Triple Operations

思路:第一步就是要变换出第一个0,由于在此过程中会有另一个数不断x3,所以实际要消耗的次数要x2,数组中的其他数就可以先不用处理,接下来就是要看每个数要除几次3才能变为0    显然的,一个个数判断耗时太多了,会TLE  所以我们预处理出一个3的幂次表(从题目中给的范围来看,处理到3的12次方就足够了) 记录下第一个数在幂次表中的位置之后,开始遍历幂次表,与数列右端进行比较,然后直接将 下标*数量 加给cnt就好了,大大减少耗时,但要注意边界条件的判断

AC代码:

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

vector<int> pow3 = {1,3,9,27,81,243,729,2187,6561,19683,59049,177147,531441};

int pan(int x){
    int cc = lower_bound(pow3.begin(),pow3.end(),x)-pow3.begin();
    if(pow3[cc]==x) cc++;
    return cc;
}

void solve(){
   int l,r;
   cin>>l>>r;
   int jilu = pan(l); //cout<<"jilu  "<<jilu<<endl;
   int cnt = jilu*2; //cout<<"pan l= "<<pan(l)<<endl;
   for(int i=jilu;i<13;i++){
        if(pow3[i]<=r){
            cnt+= i*(pow3[i]-max(l,pow3[i-1]));
            cnt+= 1;
        }
        else if(pow3[i]>r){
            cnt += i*(r-max(l,pow3[i-1]));
            break;
        }
        // else if(pow[i]<r){

        // }
   }
   cout<<cnt<<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、付费专栏及课程。

余额充值