题目在图片中,输出结果为3。当时没做出来,第二天搞了一上午。
思路是先排序,再归并,再求前缀和与后缀和,然后计算最大差值。
#include<iostream>
#include<algorithm>
#include<string> //包含了<string.h>
using namespace std;
int main()
{
int n,m;
cin>>n;
int *a=new int[n];
for(int i=0;i<n;++i)
cin>>a[i];
cin>>m;
int *b=new int[m];
for(int i=0;i<m;++i)
cin>>b[i];
sort(a,a+n);
sort(b,b+m);
int max=-1000000;
int maxindex=0;
int *merge=new int[m+n];
int *flag=new int[m+n];
int *presum=new int[m+n];
int *possum=new int[m+n];
int z=m+n;
memset(merge,0,4*z);
memset(flag,0,4*z);
memset(presum,0,4*z);
memset(possum,0,4*z);
int i=0,j=0,k=0;
for(;i<z;++i)
{
if(j<n&&a[j]<=b[k]){
merge[i]=a[j];
flag[i]=0;
j++;
}else
{
merge[i]=b[k];
flag[i]=1;
k++;
}
}
presum[0]=0,presum[1]=flag[0];
for(int i=2;i<z;++i)
presum[i]=presum[i-1]+flag[i-1];
possum[z-1]=flag[z-1];
for(int i=z-2;i>=0;i--)
possum[i]=possum[i+1]+flag[i];
for(int i=2;i<z;++i){
if(merge[i]==merge[i-1])
presum[i]=presum[i-1];
}
for(int i=z-2;i>=0;i--){
if(merge[i]==merge[i+1])
possum[i]=possum[i+1];
}
for(int i=0;i<z;++i)
{
int pre2=presum[i];
int pre1=i-pre2;
int pos2=possum[i];
int pos1=z-i-pos2;
int sum1=2*pre1+3*pos1;
int sum2=2*pre2+3*pos2;
int sub=sum1-sum2;
if(sub>max){
max=sub;
maxindex=i;
}
}
// for(int i=0;i<z;++i)
// cout<<merge[i]<<endl;
//
//
// for(int i=0;i<n;++i)
// cout<<a[i]<<endl;;
//cout<<endl;
// for(int i=0;i<m;++i)
// cout<<b[i]<<endl;
//cout<<merge[maxindex]<<endl;
cout<<max<<endl;
return 0;
}