http://pat.zju.edu.cn/contests/pat-a-practise/1037
1、两个序列做乘法,steps=较小的那个序列长度
2、排序之后,负数在前,正数在后。从前往后乘,遇到正数时,再从后往前做正数乘法
核心在于,循环退出条件
#include<iostream>
#include<algorithm>
using namespace std;
int coupon[100010];
int product[100010];
int main()
{
int nc, np,i; //优惠券和商品的个数
cin>>nc;
for (i=1;i<=nc;i++)
{
cin>>coupon[i];
}
cin>>np;
for (i=1;i<=np;i++)
{
cin>>product[i];
}
sort(coupon+1,coupon+1+nc); //分别排序
sort(product+1,product+1+np);
int ans=0;
int steps=nc-np>0?np:nc; //乘法步骤与较短序列长度相同
for (i=1;i<=steps;i++) //从前往后算:负*负得正型,全是负数,steps作为结束标志
{
if (coupon[i]>=0||product[i]>=0) //遇到负*正(正*正),break,因为从后算结果更大
{
break;
}
ans+=coupon[i]*product[i];
}
for (i=0;i<steps;i++) //从后往前,正*正型,全是正数,steps作为结束标志
{
if (coupon[nc-i]<=0||product[np-i]<=0)
{
break; //不用纠结还要多少步,从后往前肯定会碰到负数,退出循环
}
else
ans+=coupon[nc-i]*product[np-i];
}
cout<<ans<<endl;
return 0;
}