Codeforces Round 964 (Div. 4)

Codeforces Round 964 (Div. 4)

A送分

B

大意:两个人两张牌 随机翻 求a翻出来的牌比b大的可能

cpp 复制代码
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#define ep emplace_back 
using namespace std;

void solve() {
    int ans = 0;
    int a1, b1, a2, b2;
    cin >> a1 >> a2 >> b1 >> b2;
    
    int cnt1 = 0, cnt2 = 0;
    if (a1 > b1)
        cnt1++;
    else if (a1 < b1)
        cnt2++;

    if (a2 > b2)
        cnt1++;
    else if (a2 < b2)
        cnt2++;

    if (cnt1 > cnt2) 
        ans += 2;

    cnt1 = cnt2 = 0;
    if (a1 > b2)
        cnt1++;
    else if (a1 < b2)
        cnt2++;

    if (a2 > b1)
        cnt1++;
    else if (a2 < b1)
        cnt2++;

    if (cnt1 > cnt2) 
        ans += 2;

    cout << ans << "\n";
}

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

C

题目大意:有些区间被阻断 找连续的区间 判断最长的长度能否大于S

思路:保证l,r是不相交的 扫一遍所有的区间就好了 跑两个指针 pos1=0,pos2=l

cpp 复制代码
#include<iostream>
using namespace std;
void solve(){
    int n,s,m;
    scanf("%d%d%d",&n,&s,&m);
    bool ok=0;
    int pos=0;
    for(int i = 0; i < n; ++i){
        int l,r;
        scanf("%d%d",&l,&r);
        int k = l-pos;
        if( k>=s )
            ok=1;
        pos=r;
    }
    if(m-pos>=s) ok=1;
    if(ok) cout<<"YES";
    else cout<<"NO";
    cout<<"\n";
}
int main(){

    int T;
    cin>>T;
    while(T--){
        solve();
    }
}

D

题目大意:给定字串字符s t s某些字符可以修改 能否通过修改s st t是s子序列

思路:两个指针扫一遍,? 或者能匹配就让第二个指针往前跑,最后判断第二个指针跑到尾了

cpp 复制代码
#include <iostream>
#include <string>
#include <vector>
#include <unordered_set>

using namespace std;

void solve(){
    string s,t;
    cin>>s>>t;
    int j=0;

    for(int i = 0; i < s.size(); ++i){
        if(s[i] == '?' ){
            if(j < t.size()){
                s[i] = t[j];
                ++j;
            }
            else {
                s[i] = 'a';
            }
        }
        else if( s[i] == t[j] and j<t.size()){
            ++j;
        }
    }
    if(j == t.size()) cout<<"YES"<<"\n"<<s;
    else cout<<"NO";
    cout<<"\n";
}
int main(){
    int _;
    cin>>_;
    while(_ --){
        solve();
    }
}

E:

题意:写下L,L+1,...R-1,R个数字,操作他,让一个数乘以三,另一个除以三。直到所有为0 求最小的操作次数

思路:先让L为0 ans 加上操作次数 观察到[3,8] opt=2,[9,26]opt=3 只需要计算区间长度乘以区间对应的opt次数就可

cpp 复制代码
#include <iostream>
#include <cmath>
#include <cstdio>
#define lld long long
using namespace std;
int f(int x){
    int ans=0;
    while(x!=0){
        x/=3;
        ans++;
    }
    return ans;
}

void solve(){
    int L,R;
    cin>>L>>R;
    int K = f(L);
    int M = f(R);
    lld ans=0;
    int a[50],b[50];
    for(int i=0;i<=32;++i){
        a[i] = pow(3,i);
        b[i] = pow(3,i+1)-1;
    }
    ans+=2*f(L);
    int pos=L+1;
    for(int i=f(L+1) ; i <= M; ++i){
        //printf("ans=%d ",ans);
        int pos2 = b[i-1];
        if(pos2>R){
            
            pos2=R;
            //printf("pos=%d pos2=%d \n",pos,pos2);
            ans+=(pos2-pos+1)*i;
            break;
        }
        else {
            //printf("pos=%d pos2=%d \n",pos,pos2);
            ans+=(pos2-pos+1)*i;
            pos = a[i];
        }
        
    }
    cout<<ans<<"\n";
}

int main(){
    int T;
    cin>>T;
    while(T--){
        solve();
    }
}
// 2 3 4 5 6 7 8 9 10 11 12 
// 1 2 2 2 2 2 2 3 3  3   3
// 14+12 = 22

F:

大意:

思路:

cpp 复制代码