PAT_A1037
PAT甲级1037.
目录
A1037
题目
样例
输入:
4
1 2 4 -1
4
7 6 -2 -3
输出:
43
思路和坑点
正数和正数的最大值相乘,负数和负数的最小值相乘(负负得正,负数越小,绝对值越大)。然后,把每一种情况累计求和即可。
把每组的正数和负数分别存放,0忽略不计,因为0乘任何数都是0.注意两组的长度可能不同,所以注意数组不要越界。
AC代码
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
return a>b;
}
int main(void){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
vector<int> az,af,bz,bf;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){ //正数和负数分开存储
int temp;
scanf("%d",&temp);
if(temp<0)
af.push_back(temp);
else if(temp>0)
az.push_back(temp);
}
scanf("%d",&n);
for(int i=0;i<n;i++){
int temp;
scanf("%d",&temp);
if(temp<0)
bf.push_back(temp);
else if(temp>0)
bz.push_back(temp);
}
//正数从大到小排列,负数从小到大排列
sort(az.begin(),az.end(),cmp);sort(af.begin(),af.end());
sort(bz.begin(),bz.end(),cmp);sort(bf.begin(),bf.end());
int sum=0;
for(int i=0;i<az.size()&&i<bz.size();i++){ //累加求和
sum+=az[i]*bz[i];
}
for(int i=0;i<af.size()&&i<bf.size();i++){
sum+=af[i]*bf[i];
}
cout<<sum;
return 0;
}