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