A1037 Magic Coupon (25分)

2020-02-01  本文已影响0人  km15

// A1037 Magic Coupon (25分).cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
/*
题意:
1、给一串数字,有正有负,再给一串数字,有正有负
2、两两相乘,得出最大和
题目给的是整数,1~10的5次方,不超过2的30次方也就是用过long?

解法:贪心无疑,怎么实现是个问题
1、排序,大到小,两两成绩,如果大于0相加,小于0排序
2、

learn && worng;
1、错了一组
2、思路不错,按从小到大排序,相乘
3、代码要有处理正负数个数不同且为0的情况,就是两个数组元素分别大于0,或小于0
4、在进行排序后去两个集合的最大正数时,取位置n - 1和m - 1,而不是min{n - 1, m - 1}
5、在进行累加时候,不能以coupon[i] * product[i] > 0(负数))做条件,就一直循环到尾巴了!而是以occupy[i] < 0 && product[i] < 0(负数时),,occupy[i] > 0 && product[j] > 0(正数时)才对
6、负数相乘时候,因为是从左边开始,可以用同一个i,正数需要用i和j开始,注意!
*/

#include <iostream>
#include <algorithm>
using namespace std;

long long occupy[100010], product[100010];

bool cmp(long long a, long long  b) { //(!!!)这里超时了
    return a < b;
}

int main()
{
    int n1,n2;
    cin >> n1;
    for (int i = 0;i < n1;++i) {
        cin >> occupy[i];
    }

    cin >> n2;
    for (int i = 0;i < n2;++i) {
        cin >> product[i];
    }
    sort(occupy, occupy + n1,cmp);
    sort(product, product + n2, cmp);

    int i = 0,j;
    long long ans = 0;
    while (i < n1 && i < n2 && occupy[i] < 0 && product[i] < 0) {
        ans += occupy[i] * product[i];
        i++;
   }
    i = n1 - 1;
    j = n2 - 1;
    while (i >= 0 && j >= 0 && occupy[i] > 0 && product[j] > 0) {
        ans += occupy[i] * product[j];
        i--;
        j--;
    }

    cout << ans << endl;
    return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;

long long occupy[100010], product[100010];

bool cmp(int a, int b) {
    return a > b;
}

int main()
{
    int n1,n2;
    cin >> n1;
    for (int i = 0;i < n1;++i) {
        cin >> occupy[i];
    }

    cin >> n2;
    for (int i = 0;i < n2;++i) {
        cin >> product[i];
    }
    sort(occupy, occupy + n1,cmp);
    sort(product, product + n2, cmp);

    long long temp = 0;
    long long ans = 0;
    for (int i = 0;i < n1;++i) {
        temp = occupy[i] * product[i]; //成绩
        if (temp > 0) ans += temp;
    }

    cout << ans;
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读