Codeforces Round #604 (Div. 2)

2 篇文章 0 订阅

A. Beautiful String

题目链接:

https://codeforces.com/contest/1265/problem/A

Hint:

水题,除非原本的串中除了"??"以外还存在其它的相邻且相同的字符,否则一定有解,瞎搞

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

#define ll long long

char s[1000005];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        bool flag=false;
        int len=strlen(s);
        for(int i=0; i<len; i++)
        {
            if(s[i]!='?')
            {
                if(i==len-1) break;
                if(s[i]==s[i+1])
                {
                    flag=true;
                    break;
                }
            }
            else
            {
                if(i==0)
                {
                    char c1=s[i+1];
                    if(c1=='?')
                        s[i]='a';
                    else if(c1=='a')
                        s[i]='b';
                    else if(c1=='b')
                        s[i]='a';
                    else
                        s[i]='a';
                }
                else if(i==len-1)
                {
                    char c1=s[i-1];
                    if(c1=='a')
                        s[i]='b';
                    else if(c1=='b')
                        s[i]='a';
                    else
                        s[i]='a';
                }
                else
                {
                    char c1=s[i-1];
                    char c2=s[i+1];
                    if(c1=='a')
                    {
                        if(c2=='a')
                            s[i]='b';
                        else if(c2=='b')
                            s[i]='c';
                        else if(c2=='c')
                            s[i]='b';
                        else
                            s[i]='b';
                    }
                    else if(c1=='b')
                    {
                        if(c2=='a')
                            s[i]='c';
                        else if(c2=='b')
                            s[i]='a';
                        else if(c2=='c')
                            s[i]='a';
                        else
                            s[i]='a';
                    }
                    else//c
                    {
                        if(c2=='a')
                            s[i]='b';
                        else if(c2=='b')
                            s[i]='a';
                        else if(c2=='c')
                            s[i]='a';
                        else
                            s[i]='b';
                    }
                }

            }

        }
        if(flag) printf("-1\n");
        else printf("%s\n",s);
    }

    return 0;
}

 

B. Beautiful Numbers

题目链接:

https://codeforces.com/contest/1265/problem/B

Hint:

思维

标一下各个数字所在的位置,O(n)扫一遍,每次更新最大值最小值,若位置i满足条件,很显然有(maxn-minn+1)==i

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

#define ll long long

int p[200005];
int loc[200005];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&p[i]);
            loc[p[i]]=i;
        }
        int minn=n+1,maxn=0;
        for(int i=1;i<=n;i++)
        {
            minn=min(minn,loc[i]);
            maxn=max(maxn,loc[i]);
            if(maxn-minn+1==i)
            {
                printf("1");
            }
            else
            {
                printf("0");
            }
        }
        printf("\n");
    }
    return 0;
}

 

C. Beautiful Regional Contest

题目链接:

https://codeforces.com/contest/1265/problem/C

Hint:

贪心、让金牌取第一大的数判是否可行

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

#define ll long long

int hm[400005];
int p[400005];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(hm,0,sizeof(hm));
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&p[i]);
        }
        int loc=n/2;
        while(p[loc]==p[loc+1])
            loc--;
        int cnt=1,hm1=0,hm2=0;
        p[0]=p[1];
        for(int i=1;i<=loc;i++)
        {
            if(p[i]!=p[i-1])
                cnt++;
            hm[cnt]++;
        }
        if(cnt<3)
        {
            printf("0 0 0\n");
        }
        else
        {
            int sumb=0;
            for(int i=2;i<=cnt;i++)
            {
                sumb+=hm[i];
                if(sumb>hm[1])
                {
                    break;
                }
            }
            int sumc=loc-hm[1]-sumb;
            //cout<<hm[1]<<' '<<hm[1]<<' '<<sumb<<' '<<sumc<<endl;
            if(sumc<=hm[1])
            {
                printf("0 0 0\n");
            }
            else
            {
                printf("%d %d %d\n",hm[1],sumb,sumc);
            }
        }
    }
    return 0;
}

 

D. Beautiful Sequence

题目链接:

https://codeforces.com/contest/1265/problem/D

Hint:

推导、分类

画个图更好理解

分析一下0和1之间的数量关系、2和3之间的数量关系

再分个类即可

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

#define ll long long

int ans[400005];

int main()
{
    int a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    if(a==0&&b==0&&d==c+1)
    {
        printf("YES\n");
        for(int i=1;i<=c;i++)
        {
            if(i!=1)
                printf(" ");
            printf("3 2");
        }
        printf(" 3\n");
    }
    else if(c==0&&d==0&&a==b+1)
    {
        printf("YES\n");
        for(int i=1;i<=b;i++)
        {
            if(i!=1)
                printf(" ");
            printf("0 1");
        }
        printf(" 0\n");
    }
    else if(a<=b&&d<=c)
    {
        if(b-a==c-d)
        {
            printf("YES\n");
            for(int i=1;i<=a;i++)
            {
                if(i!=1)
                    printf(" ");
                printf("0 1");
            }
            if(a!=0) printf(" ");
            for(int i=1;i<=b-a;i++)
            {
                if(i!=1)
                    printf(" ");
                printf("2 1");
            }
            if(b-a!=0) printf(" ");
            for(int i=1;i<=d;i++)
            {
                if(i!=1)
                    printf(" ");
                printf("2 3");
            }
            printf("\n");
        }
        else if(b-(a+1)==c-d)
        {
            printf("YES\n");
            for(int i=1;i<=a;i++)
            {
                if(i!=1)
                    printf(" ");
                printf("1 0");
            }
            if(a!=0) printf(" ");
            printf("1 ");
            for(int i=1;i<=c-d;i++)
            {
                if(i!=1)
                    printf(" ");
                printf("2 1");
            }
            if(a!=0||b-a!=0) printf(" ");
            for(int i=1;i<=d;i++)
            {
                if(i!=1)
                    printf(" ");
                printf("2 3");
            }
            printf("\n");
        }
        else if(b-a==c-(d+1))
        {
            printf("YES\n");
            for(int i=1;i<=a;i++)
            {
                if(i!=1)
                    printf(" ");
                printf("0 1");
            }
            if(a!=0) printf(" ");
            for(int i=1;i<=b-a;i++)
            {
                if(i!=1)
                    printf(" ");
                printf("2 1");
            }
            if(b-a!=0) printf(" ");
            for(int i=1;i<=d;i++)
            {
                if(i!=1)
                    printf(" ");
                printf("2 3");
            }
            printf(" 2\n");
        }
        else
        {
            printf("NO\n");
        }
    }
    else
        printf("NO\n");

    return 0;
}

 

E. Beautiful Mirrors

题目链接:

https://codeforces.com/contest/1265/problem/E

Hint:

数学、概率

我是用概率dp做的(和以前做过的HDU 6656很像),好像还有别的更快的方法

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

#define ll long long

const ll mod=998244353;
int p[200005];
ll dp[200005];
ll sum[200005];

ll quick_pow(ll x,ll a)
{
    ll ans=1;
    while(a)
    {
        if(a&1)
        {
            ans*=x;
            ans%=mod;
        }
        x*=x;
        x%=mod;
        a>>=1;
    }
    return ans;
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&p[i]);
    }
    for(int i=1;i<=n;i++)
    {
        ll x=100,y=quick_pow(p[i],mod-2);
        x*=y;
        x%=mod;
        dp[i]=1+(x-1)*(sum[i-1]+1);
        dp[i]%=mod;
        sum[i]=sum[i-1]+dp[i];
        sum[i]%=mod;
    }
    printf("%I64d\n",sum[n]);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值