Codeforces Round #605 (Div.3)

Codeforces Round #605 Div.3

  • A
  • B
  • C
  • D
  • E
  • F

A

题意:给出三个人的位置,每个人可以走一步,使每两个人之间的距离相加最小。
题记:找出三个人的坐标的最大值和最小值,让最大值减去最小值减2再乘2即是答案,如果答案小于0则输出0。

#include
using namespace std;

int main(){
    int t;
    cin>>t;
    while(t--){
        int a[3];
        cin>>a[0]>>a[1]>>a[2];
        sort(a,a+3);
        if(a[2]-a[0]-2<0)
            cout<<0<<endl;
        else
            cout<<(a[2]-a[0]-2)*2<<endl;
    }
    return 0;
}

B

题意:一个机器人可以左右上下(LRUD)走,起点在(0,0),不能在同一个点走两次(0,0)除外。给一个字符串表示机器人一开始走的路径。可以对开始的路径进行删除和重新排序,使机器人从(0,0)走到(0,0)。

题记:直接构造即可,一开始题目理解错了导致做了很久代码很长…(要认真读题啊啊啊啊啊啊!!!)。

#include
using namespace std;
const int INF=0x3f3f3f3f;
int a[4];
char c[4]={'L','R','U','D'};
int main(){
    int t;
    cin>>t;
    while(t--){
        string s;
        memset(a,0,sizeof(a));
        cin>>s;
        for(int i=0;i<s.size();++i){
            if(s[i]=='L')
                a[0]++;
            else if(s[i]=='R')
                a[1]++;
            else if(s[i]=='U')
                a[2]++;
            else
                a[3]++;
        }
        if(a[0]==0||a[1]==0)
            a[0]=a[1]=0;
        if(a[2]==0||a[3]==0)
            a[2]=a[3]=0;
        int sum1=min(a[0],a[1]);
        int sum2=min(a[2],a[3]);
        if(!sum1&&!sum2)
            cout<<0<<endl;
        else if(!sum1)
            cout<<2<<endl<<"UD"<<endl;
        else if(!sum2)
            cout<<2<<endl<<"LR"<<endl;
        else{
            int ans=sum1*2+sum2*2;
            cout<<ans<<endl;
            for(int i=0;i<sum1;i++)
                cout<<c[0];
            for(int i=0;i<sum2;i++)
                cout<<c[2];
            for(int i=0;i<sum1;i++)
                cout<<c[1];
            for(int i=0;i<sum2;i++)
                cout<<c[3];
            cout<<endl;
        }
    }
    return 0;
}

C

题意:给一个长度为n的字符串,用k个字母写出字符串的字串,求字串的个数。
题记:用数组t记录下可以输入的字母,遍历一遍字符串,用sum记录连续的有效字母的个数,当遍历到一个无效的字母或者遍历到字符串最后一个字符算出sum*(sum+1)/2,用ans加上,最后输出即可。

#include
using namespace std;
const int N=2e5+10;
typedef long long ll;
int a[N];
int t[30];
int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    string s;
    cin>>s;
    char c;
    while(k--){
        cin>>c;
        t[c-'a']++;
    }
    ll ans=0,sum=0;
    for(int i=0;i<n;i++){
        if(!t[s[i]-'a']||i==n-1){
            if(i==n-1&&t[s[i]-'a'])
                sum++;
            ans+=sum*(sum+1)/2;
            //cout<
            sum=0;
        }
        else
            sum++;
    }
    cout<<ans<<endl;
    return 0;
}

D

题意:给一个数组,可以选择删除一个数字或者不删,找出最长的递增的子数组的长度。
题记:用dp[i][0]来记录没有删除数字时以第i个数为结尾的递增子数组的长度。dp[i][1]取没有删除数字和删除了数字两种情况的最大值。

#include
using namespace std;
const int N=2e5+10;
typedef long long ll;
int a[N];
int dp[N][2];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    int ans=0;
    for(int i=1;i<=n;i++){
        dp[i][0]=1;
        dp[i][1]=1;
        if(a[i]>a[i-1]){
            dp[i][0]=dp[i-1][0]+1;
        }
        if(a[i]>a[i-2])
            dp[i][1]=max(dp[i-2][0]+1,dp[i][0]);
        if(a[i]>a[i-1])
            dp[i][1]=max(dp[i][1],dp[i-1][1]+1);
        ans=max(dp[i][1],ans);
    }
    cout<<ans<<endl;
    return 0;
}

E

F

你可能感兴趣的:(codeforces)