CodeForces - 1512C和CodeForces - 1512D

CodeForces - 1512C
给一串包含0,1,?的字符串,并给出a,b。可以将字符串中的?改成0或者1.最终使字符串中有 a 个 0,b 个 1 ,并且字符串回文。
用a,b减去原字符串中有多少个0或1,再从两边向中央靠拢;

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[5001212];
int main()
{
    int p;
    scanf("%d",&p);
    while(p--)
    {
        int a,b,i,j;
        scanf("%d %d",&a,&b);
        scanf("%s",s);
        i=0,j=a+b-1;
        while(i<j)
        {
            if(s[i]!=s[j]&&(s[i]=='?'||s[j]=='?'))
            {
                if(s[i]=='?')
                {
                    s[i]=s[j];
                }
                else if(s[j]=='?')
                {
                    s[j]=s[i];
                }
            }
            i++;
            j--;
        }
        int cnt1=a,cnt2=b;
        for(i=0;i<(a+b);i++)
        {
            if(s[i]=='0')
                cnt1--;
            else if(s[i]=='1')
                cnt2--;
        }
        i=0,j=a+b-1;
        while(i<j)
        {
            if(s[i]==s[j]&&s[i]=='?')
            {
                if(cnt1>=cnt2)
                {
                    s[i]=s[j]='0';
                    cnt1-=2;
                }
                else
                {
                    s[i]=s[j]='1';
                    cnt2-=2;
                }
            }
            i++;
            j--;
        }
        int flog=0;
        i=0,j=a+b-1;
        while(i<j)
        {
            if(s[i]!=s[j])
            {
                flog=1;
                break;
            }
            i++;
            j--;
        }
        if((a+b)%2==1)
        {
            if(cnt1)
            {
            //    printf("*****\n");
                if(s[(a+b)/2]=='0'||s[(a+b)/2]=='?')
                {
                    s[(a+b)/2]='0';
                    cnt1--;
                }
            }
            else if(cnt2)
            {
                if(s[(a+b)/2]=='1'||s[(a+b)/2]=='?')
                {
                    s[(a+b)/2]='1';
                    cnt2--;
                }
            }
        }
        //printf("%d %d %d\n",cnt1,cnt2,flog);
        if(cnt1||cnt2||flog)
            printf("-1\n");
        else
            printf("%s\n",s);
    }
}

CodeForces - 1512D
从数组中删去一个数。从剩下的数中,再选一个数,使剩下数的和等于此数。
将数组求和,随机删去一个数,将和再除以2,若此数再数组出现过,则可以组成

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[10010111];
int main()
{
    ll p;
    scanf("%lld",&p);
    while(p--)
    {
        map<ll,int> mp;
        ll n,flog=0;
        scanf("%lld",&n);
        ll k,i,j,ans=0;
        k=n+2;
        for(i=1;i<=k;i++)
        {
            scanf("%lld",&a[i]);
            mp[a[i]]++;
            ans+=a[i];
        }
        for(i=1;i<=k;i++)
        {
            ll sum=ans-a[i],f=0;
            mp[a[i]]--;
            if(sum%2==0&&mp[sum/2])
            {
                for(j=1;j<=k;j++)
                {
                    if(j==i)
                        continue;
                    if(a[j]==sum/2&&f==0)
                    {
                        f=1;
                        continue;
                    }
                    printf("%lld ",a[j]);
                }
                flog=1;
                break;
            }
            mp[a[i]]++;
        }
      //  printf("%d***\n",flog);
        if(flog==0)
            printf("-1");
        printf("\n");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值