贪心算法练习不能正常工作

时间:2017-11-19 16:29:22

标签: c++ greedy

我在高中并很快接受考试,其中一个主题是贪心算法。我对这个练习有一个未知的问题:"给出一个N个整数的数组。使用Greedy算法,确定可以写成两个数组元素的乘法的最大数字" (对不起,如果它有点不清楚,我不是母语为英语的人)。

现在,我想要解决这个问题的方法是:找到最大的两个数字和最低的两个数字(如果它们都是负数)并显示两个最大或两个最低的乘法,取决于哪个数字更大。

这就是我写的:

#include <iostream>
using namespace std;

int a[100001],n;

int main()
{

int max1=-1000001,max2=-1000001,min1=1000001,min2=1000001,x;
cin>>n;

for (int i=1; i<=n; i++)
{
    cin>>a[i];

    if (a[i]>=max2)
    {
        if (a[i]>=max1)
        {
            x=max1;
            max1=a[i];
            max2=x;
        }
        else max2=a[i];
    }

    if (a[i]<=min2)
    {
        if (a[i]<=min1)
        {
            x=min1;
            min1=a[i];
            min2=x;
        }
        else min2=a[i];
    }
}

if (n==1)
    cout<<n;
else if (max1*max2>=min1*min2)
    cout<<max1*max2;
else cout<<min1*min2;

return 0;
}

是的,我知道我写它的方式是凌乱/丑陋的。但是,代码应该正常运行,我使用练习提供的示例和许多不同的情况对其进行了测试。他们都给出了正确的结果。问题是编程练习网站给我的代码一个80/100的分数,不是因为时间而是因为错误的答案。

我已经花了2个多小时查看这段代码,而我却无法弄清楚它有什么问题。任何人都可以指出这个缺陷吗?谢谢&lt; 3

1 个答案:

答案 0 :(得分:1)

问题很可能来自于乘以2个int会给你一个int。 int通常具有-2,147,483,648 to 2,147,483,647范围。

如果您再乘以2,147,483,647 * 2,则获得-2。同样,2,147,483,647 + 1将会为您提供-2147483648。当值达到最大值时,它会通过转到可能的最低值来处理。

要部分解决问题,您只需要将其中一个变量转换为64位整数。对于现代C ++,int64_t

if (n==1)
    cout<<n;
else if (static_cast<int64_t>(max1)*max2>=static_cast<int64_t>(min1)*min2)
    cout<<static_cast<int64_t>(max1)*max2;
else cout<<static_cast<int64_t>(min1)*min2;

但如果两个值足够大,你仍然可以获得太大的数字。因此,您需要uint64_t的完整范围,即无符号版本。

所以我们需要转换为uint64_t,但是你会遇到另一个问题,数字低于0.所以首先你应该将min1和min2转换为等效的正数,然后转换为{{ 1}}。

uint64_t

现在你可以继续做

uint64_t positive_min1, positive_min2;
if (min1 < 0 && min2 < 0) {
    positive_min1 = min1*-1;
    positive_min2 = min2*-1;
}
else {
    positive_min1 = 0;
    positive_min2 = 0;
}

无需施放positive_min1&amp; 2因为它已经转换为if (n==1) cout<<n; else if (static_cast<uint64_t>(max1)*max2>=positive_min1*positive_min2) cout<<static_cast<int64_t>(max1)*max2; else cout<<positive_min1*positive_min2;

由于您要将uint64_t转换为无符号,因此您应该首先检查它是否不低于0.

如果签名和无符号概念不熟悉,您可以阅读有关该概念和不同数据类型的here