zoukankan      html  css  js  c++  java
  • PAT甲题题解-1037. Magic Coupon (25)-贪心,水

    题目说了那么多,就是给你两个序列,分别选取元素进行一对一相乘,求得到的最大乘积。

    将两个序列的正和负数分开,排个序,然后分别将正1和正2前面的相乘,负1和负2前面的相乘,累加和即可。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <string.h>
    #include <cmath>
    #include <vector>
    using namespace std;
    const int maxn=100000+5;
    int coupon1[maxn];
    int c1;
    int coupon2[maxn];
    int c2;
    int product1[maxn];
    int product2[maxn];
    int p1,p2;
    
    bool cmp(int a,int b){
        return a>b;
    }
    int main()
    {
        int nc,np;
        long long tmp;
        c1=c2=p1=p2=0;
        scanf("%d",&nc);
        for(int i=0;i<nc;i++){
            scanf("%lld",&tmp);
            if(tmp>=0)
                coupon1[c1++]=tmp;
            else
                coupon2[c2++]=tmp;
        }
        scanf("%d",&np);
        for(int i=0;i<np;i++){
            scanf("%lld",&tmp);
            if(tmp>=0)
                product1[p1++]=tmp;
            else
                product2[p2++]=tmp;
        }
        long long ans=0;
        sort(coupon1,coupon1+c1,cmp);
        sort(product1,product1+p1,cmp);
        sort(coupon2,coupon2+c2);
        sort(product2,product2+p2);
        int min1=min(c1,p1);
        for(int i=0;i<min1;i++){
            ans+=coupon1[i]*product1[i];
        }
        int min2=min(c2,p2);
        for(int i=0;i<min2;i++){
            ans+=coupon2[i]*product2[i];
        }
        printf("%lld
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    gcc数据对齐之: howto 2.
    gcc数据对齐之: howto 1.
    gcc数据结构对齐之:why.
    linux tricks 之 BUILD_BUG_ON_ZERO.
    linux tricks 之 FIELD_SIZEOF.
    linux tricks 之 container_of.
    linux tricks 之 bitmap分析.
    linux tricks 之 roundup.
    Windows之svn问题
    Embeded linux之地址映射
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6789124.html
Copyright © 2011-2022 走看看