解题思路:
1、优惠券和商品价值按降序排序(选用c自带的qsort函数,最后一个测试点才没有超时,自己写的快排超时了,堆排没有试)
2、先从前往后找,优惠券和商品价值相乘为正的,累计在sum里
同理,再从后往前找优惠券和商品价值相乘为正的,累计在sum里
#include <stdio.h> #include <string.h> int cmp(const void *a,const void *b) { return *(int *)b-*(int *)a; } int main() { int n; scanf("%d",&n); int i,j; int a[n]; memset(a,0,sizeof(a)); for(i=0; i<n; i++) { scanf("%d",&a[i]); } qsort(a,n,sizeof(int),cmp); int m; scanf("%d",&m); int b[m]; memset(b,0,sizeof(b)); for(i=0; i<m; i++) { scanf("%d",&b[i]); } qsort(b,m,sizeof(int),cmp); int sum=0; int p1=0,q1=n-1; int p2=0,q2=m-1; while(p1<=q1&&p2<=q2) {//从前往后 if(a[p1]*b[p2]>0) { sum+=a[p1]*b[p2]; p1++; p2++; } else break; } while(p1<=q1&&p2<=q2) {//从后往前 if(a[q1]*b[q2]>0) { sum+=a[q1]*b[q2]; q1--; q2--; } else break; } printf("%d",sum); return 0; }