简单题,先将两数列从小到大排序,再遍历个数少的数列,使得
短数列:[----] [++++]
对 应:| | | |
长数列:[---------][++++++++]
负数与长数列的头部相乘,正数与长数列的尾部相乘。
AC代码:
//1037 17:57-18:59
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MAXN=100005;
int a[MAXN],b[MAXN];
bool cmp(const int &x,const int &y)
{
return x < y;
}
int main()
{
int i,j,nc,np;
//freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);
scanf("%d",&nc);
int az=0,af=0;
int bz=0,bf=0;
for(i=0;i<nc;i++){
scanf("%d",&a[i]);
if(a[i]>=0)
az++;
else
af++;
}
scanf("%d",&np);
for(j=0;j<np;j++){
scanf("%d",&b[j]);
if(b[j]>=0)
bz++;
else
bf++;
}
sort(a,a+nc,cmp);
sort(b,b+np,cmp);
int begin=0,end=0;
int sum=0;
if(nc<=np){
begin=0;
end=np-az;//长数列要处理的尾部指针
for(i=0;i<nc;i++){
if(a[i]>=0){
if(b[end]>0)//双正才相乘, 否则略过
sum+=a[i]*b[end++];
else
end++;
} else if(a[i]<0) {
if(b[begin]<0)//双负才相乘,否则略过
sum+=a[i]*b[begin++];
else
begin++;
}
}
} else {
begin=0;
end=nc-bz;
for(i=0;i<np;i++){
if(b[i]>=0){
if(a[end]>=0)
sum+=b[i]*a[end++];
else
end++;
} else if(b[i]<0){
if(a[begin]<0)
sum+=b[i]*a[begin++];
else
begin++;
}
}
}
printf("%d",sum);
return 0;
}