pat 1037 Magic Coupon

简单题,先将两数列从小到大排序,再遍历个数少的数列,使得

短数列:[----]               [++++]

对    应:|    |               |         |

长数列:[---------][++++++++]

负数与长数列的头部相乘,正数与长数列的尾部相乘。

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


你可能感兴趣的:(pat 1037 Magic Coupon)