//一下子就ac了,爽!这一题这么 简单居然25分。要注意的就是下面两点
//关键点,把0去除掉
//记得小数倒序排,然后正数,负数,按照下标相同直接相乘累加
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
//需要4个数组
bool cmp(int a,int b){
return a>b;
}
int ncp[100010],ncn[100010],npp[100010],npn[100010];
int cpr=0,cnr=0,ppr=0,pnr=0;
int main(){
int nc,np;
scanf("%d",&nc);
while(nc--){
int temp;
scanf("%d",&temp);
if(temp==0) continue;
if(temp>0) ncp[cpr++]=temp;
else ncn[cnr++]=temp;
}
scanf("%d",&np);
while(np--){
int temp;
scanf("%d",&temp);
if(temp==0) continue;
if(temp>0) npp[ppr++]=temp;
else npn[pnr++]=temp;
}
sort(ncp,ncp+cpr,cmp);//正数从大到小排序,然后下标一样的一起乘
sort(npp,npp+ppr,cmp);
sort(ncn,ncn+cnr);
sort(npn,npn+pnr);
int ans=0;
for(int i=0;i<cpr&&i<ppr;i++){
ans+=ncp[i]*npp[i];
}
for(int i=0;i<cnr&i<pnr;i++){
ans+=ncn[i]*npn[i];
}
printf("%d\n",ans);
return 0;
}
书上的版本更加简洁明晰,还是要学习书上的的
//不小心把&&与写成了&
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100010;
int coupon[maxn],product[maxn];
int main(){
int n,m;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&coupon[i]);
}
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d",&product[i]);
}
sort(coupon,coupon+n);//直接从小到大排序
sort(product,product+m);//直接从大到小排序
int i=0,j,ans=0;
while(i<n&&i<m&&coupon[i]<0&&product[i]<0){
ans+=coupon[i]*product[i];
i++;
}
i=n-1;
j=m-1;
while(i>=0&&j>=0&&coupon[i]>0&&product[j]>0){
ans+=coupon[i]*product[j];
i--;j--;
}
printf("%d\n",ans);
return 0;
}