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");
}
}