1037. Magic Coupon_两数字序列乘法

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;  
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值