这是L,K,C,E,B,G的题解,别问为什么替他的没有,问就是不会😢

L

首先是L,很简单的签到题,直接亮代码👌

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    for(int x=1;x<=10;x++){
        if(n*x%10==0){
            cout<<x;
            break;
        }
    }
    return 0;
}

K

K是一道数学题,举举例子就会发现只有“1”和“3”有答案,知道后就十分简单了😎

#include<bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    for(int j=0;j<t;j++){
        int n;
        cin>>n;
        if(n==1){
            cout<<"YES"<<endl<<1<<endl;
        }else if(n==3){
            cout<<"YES"<<endl<<1<<" "<<2<<" "<<3<<endl;
        }else{
            cout<<"NO"<<endl;
        }
    }
    return 0;
}

C

c是一道思维题,因为可以多次操作的原因,本可以全部都是最大值(前提是n>=3哦,n==1 or n==2要分类了),但题目说是开区间,所以要分类了😥,如果最大值不在头和尾,那么除了头和尾都可以变成最大值,如果在头则尾变不了,反之,在尾则头变不了😊,代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    for(int j=0;j<t;j++){
        int n;
        cin>>n;
        long long a[500005];
        long long maxi=0;
        int wezhi=1;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            if(a[i]>maxi){
                maxi=a[i];
                wezhi=i;
            }
        }
        if(n==1){
            cout<<a[1]<<endl;
            continue;
        }else if(n==2){
            cout<<a[1]+a[2]<<endl;
            continue;
        }
        if(wezhi==1){
            cout<<maxi*(n-1)+a[n]<<endl;
        }else if(wezhi==n){
            cout<<a[1]+maxi*(n-1)<<endl;
        }else{
            cout<<maxi*(n-2)+a[1]+a[n]<<endl;
        }
    }
    return 0;
}

E

这道题很简单,就是相邻两个加起来找最大值,当然还有k和头及尾的和值,代码如下😘

#include<bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    for(int j=0;j<t;j++){
        int n,k;
        cin>>n>>k;
        int a[200005];
        int maxi=-2000000;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            if(i>1&&a[i]+a[i-1]>maxi){
                maxi=a[i]+a[i-1];
            }
        }
        if(a[1]>=a[n]&&k+a[1]>maxi){
            maxi=k+a[1];
        }else if(a[1]<a[n]&&a[n]+k>maxi){
            maxi=k+a[n];
        }
        cout<<maxi<<endl;
    }
    return 0;
}

B

依旧思维题,因为得分要移除手牌,所以只要保证比小红最小的还小的牌在最后,让其不会卡在手里即可,并且题目只要求考虑小苯的最高分,所以不用考虑小红,只要把比小红最小的大的牌全排列*比小红最小的还小的牌全排列,即可(注意计算取余哦!!!)😉,代码如下:

#include<bits/stdc++.h>
using namespace std;
const int m=998244353;
int main(){
    int t;
    cin>>t;
    for(int j=0;j<t;j++){
        int n;
        cin>>n;
        int a[200005];
        int b[200005];
        int num_xiao=0;
        int num_da=0;
        int b_mini=2*n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        for(int i=1;i<=n;i++){
            cin>>b[i];
            if(b[i]<b_mini){
                b_mini=b[i];
            }
        }
        for(int i=1;i<=n;i++){
            if(a[i]<b_mini){
                num_xiao++;
            }else{
                num_da++;
            }
        }
        long long xiao=1;
        long long da=1;
        if(num_xiao==0||num_xiao==1){
            for(int i=2;i<=num_da;i++){
                da=da*i%m;
            }
            cout<<da%m<<endl;
        }else if(num_da==1||num_da==0){
            for(int i=2;i<=num_xiao;i++){
                xiao=xiao*i%m;
            }
            cout<<xiao%m<<endl;
        }else{
            for(int i=2;i<=num_da;i++){
                da=da*i%m;
            }
            for(int i=2;i<=num_xiao;i++){
                xiao=xiao*i%m;
            }
            cout<<da*xiao%m<<endl;
        }
    }
    return 0;
}

G

还是思维题,我的脑子要炸了🥲,我的方法简单粗暴,把可能的答案都比一遍,first,l本身倒序,second,最大位数减一,后边都是9(当然要考虑和r大小的关系),third,最大位数不变,后面尽量变成9(同样要考虑和r大小的关系),注意!!!这题r,l大的可怕,所以注意整数类型和处理方法😉,代码如下:

#include<bits/stdc++.h>
using namespace std;
long long solve(long long a){
    long long res=0;
    while(a>0){
        int dig=a%10;
        res=res*10+dig;
        a/=10;
    }
    return res;
}
int main(){
    int t;
    cin>>t;
    for(int j=0;j<t;j++){
        long long l,r;
        cin>>l>>r;
        long long first=0;
        long long second=0;
        if(r%10==9){
            first=solve(r);
        }else{
            int cnt=r%10;
            long long cnt1=r-cnt-1;
            if(cnt1>=l){
                first=solve(cnt1);
            }else{
                first=solve(r);
            }
        }
        long long cnt2=r;
        long long num=1;
        while(cnt2>0){
            cnt2/=10;
            num*=10;
        }
        num/=10;
        if((r/num-1)*num+(num-1)>=l&&(r/num-1)*num+(num-1)<=r){
            second=solve((r/num-1)*num+(num-1));
        }
        long long ans=max(first,second);
        long long tenk=10;
        for(int k=1; k<=16;k++){
            long long third=(r/tenk)*tenk+(tenk - 1);
            if(third>r){
                if(r/tenk==0)break;
                third=(r/tenk-1)*tenk+(tenk - 1);
            }
            if(third>=l&&third<=r){
                ans=max(ans,solve(third));
            }
            tenk*=10;
            if(tenk>r*10)break;
        }
        ans=max(ans,solve(l));
        ans=max(ans,solve(r));
        cout<<ans<<endl;
    }
    return 0;
}