1037.Magic Coupon

来源:互联网 发布:测试网络端口命令 编辑:程序博客网 时间:2024/05/29 17:51
【题意】
        给出一些优惠券面值和一些商品价格,可以将某一优惠券的面值乘以某一商品价格,若结果为正则能拿回那么多钱,否则支付那么多钱。题目要求能拿回来的钱尽量多

【思路】

        对于优惠券和价格分别分正数和负数排序,两者都按照绝对值的递减顺序排,然后对于两个正数数列、两个负数数列分别从前往后对应相乘并累加结果即可


#include <iostream>#include <vector>#include <algorithm>using namespace std;bool cmpP(long long n1, long long n2){return n1>n2;}bool cmpN(long long n1, long long n2){return n1<n2;}int main(int argc, char const *argv[]){vector<long long> ncP,ncN,npP,npN;int ncCnt, npCnt;cin >> ncCnt;for(int i=0; i<ncCnt; i++){long long num;cin >> num;if(num>0){ncP.push_back(num);}else if(num<0){ncN.push_back(num);}}cin >> npCnt;for(int i=0; i<npCnt; i++){long long num;cin >> num;if(num>0){npP.push_back(num);}else if(num<0){npN.push_back(num);}}sort(ncP.begin(), ncP.end(), cmpP);sort(ncN.begin(), ncN.end(), cmpN);sort(npP.begin(), npP.end(), cmpP);sort(npN.begin(), npN.end(), cmpN);long long sum = 0;vector<long long>::iterator ncIt,npIt;for(ncIt=ncP.begin(),npIt=npP.begin(); ncIt!=ncP.end() && npIt!=npP.end(); ncIt++,npIt++){sum += (*ncIt)*(*npIt);}for(ncIt=ncN.begin(),npIt=npN.begin(); ncIt!=ncN.end() && npIt!=npN.end(); ncIt++,npIt++){sum += (*ncIt)*(*npIt);}cout << sum;system("pause");return 0;}


0 0