PAT A1037 Magic Coupon 记得把0剔除哦

//一下子就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;
} 


你可能感兴趣的:(C++,算法,pat)