题目链接

前四题手速题

A. Three Friends

#include<bits/stdc++.h>
using namespace std;
int n,a[10];
int main()
{
    n=3;
    int _;cin>>_;while(_--)
    {
        for(int i=1;i<=n;++i) scanf("%d",&a[i]);
        sort(a+1,a+1+n);
        if(a[1]<a[2]) a[1]++;
        else if(a[1]==a[2]&&a[1]<a[3]) a[1]++,a[2]++;

        if(a[3]>a[2]) a[3]--;
        else if(a[3]==a[2]&&a[2]>a[1]) a[2]--,a[3]--;

        int ans=a[3]-a[2]+a[2]-a[1]+a[3]-a[1];
        printf("%d\n",ans);
    }
}

B. Snow Walking Robot

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
char s[N];
int main()
{
    int _;cin>>_;while(_--)
    {
        scanf("%s",s+1);
        int n=strlen(s+1);
        int t[10];
        t[0]=t[1]=t[2]=t[3]=0;
        int f=1;
        for(int i=1;i<=n&&f;++i){
            if(s[i]=='L') t[0]++;
            else if(s[i]=='R') t[1]++;
            else if(s[i]=='U') t[2]++;
            else t[3]++;

        }
        int x=min(t[0],t[1]);
        int y=min(t[2],t[3]);
        if(x&&y){
            printf("%d\n",2*x+2*y);
            for(int i=1;i<=x;++i) printf("L");
            for(int i=1;i<=y;++i) printf("U");
            for(int i=1;i<=x;++i) printf("R");
            for(int i=1;i<=y;++i) printf("D");
            puts("");
        }
        else if(x){
            puts("2");
            printf("LR\n");
        }
        else if(y){
            puts("2");
            printf("UD\n");
        }
        else puts("0");

    }
}

C. Yet Another Broken Keyboard

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
char s[N];
int k,vis[30],n;
int main()
{
    scanf("%d%d",&n,&k);
    scanf("%s",s+1);
    for(int i=1;i<=k;++i) {
        char c;
        cin>>c;
        vis[c-'a']=1;
    }

    ll ans=0;
    for(int i=1;i<=n;++i){
        int id=i;
        if(vis[s[id]-'a']){
            while(id+1<=n&&vis[s[id+1]-'a']) ++id;
            ll len=id-i+1;
            ans+=len*(len+1)/2;
            i=id;
        }

    }
    printf("%lld\n",ans);
}

D. Remove One Element

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f;
int l[N],r[N],n,a[N];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d",&a[i]);
    int t=1;
    for(int i=1;i<=n;++i){
        if(a[i]<=a[i-1]) t=i;
        l[i]=t;
    }
    t=n;
    a[n+1]=inf;
    for(int i=n;i>=1;--i){
        if(a[i]>=a[i+1]) t=i;
        r[i]=t;
    }
    int ans=0;
    for(int i=1;i<=n;++i) ans=max(ans,r[i]-l[i]+1);

    for(int i=2;i<=n-1;++i){
        if(a[i+1]>a[i-1]) {
            ans=max(ans,r[i+1]-l[i-1]);
        }
    }
    printf("%d\n",ans);

}
/*
1 2 3 2 3 4 5 6

1 2 3 3 3 3 4 5
5 5 5 5 4 3 2 1
*/

E. Nearest Opposite Parity

根据题意可以构造一个图,但是权值是逆着图传递,那我们反向建图即可。。。从答案为1的点开始遍历图

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],n,dp[N];
vector<int>G[N];

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
        dp[i]=-1;
    }
    queue<int>que;
    int tmp=0;
    for(int i=1;i<=n;++i){
        if(i+a[i]<=n) G[i+a[i]].push_back(i);
        if(i+a[i]<=n&&a[i]%2!=a[i+a[i]]%2) {
            que.push(i),dp[i]=1;
        }
        if(i-a[i]>=1) G[i-a[i]].push_back(i);
        if(i-a[i]>=1&&a[i]%2!=a[i-a[i]]%2) {
            que.push(i),dp[i]=1;
        }
    }


    while(que.size()){
        int id=que.front();que.pop();
        for(int v:G[id]) {
           if(dp[v]==-1){
                dp[v]=dp[id]+1;
                que.push(v);
           }
        }
    }
    for(int i=1;i<=n;++i) printf("%d ",dp[i]);
    puts("");
    return 0;
}
/*
10
10 3 10 3 5 4 10 9 9 8
*/