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