当前位置: 首页 > 知识库问答 >
问题:

给定3个正整数,求最大步数将其降为0

汪正雅
2023-03-14

我正在解决这个来自CodeForces的问题:

我们给出了三个值:RGB,它们分别代表三堆中红色、绿色和蓝色糖果的数量。Tanya不能一天吃两个相同颜色的糖果,也就是说,她每天吃两个不同颜色的糖果。找出Tanya可以吃糖果的最大天数。

int main() {
    int t, r, g, b;
    cin>>t;

    while(t--) {
        int counter=0;
        cin >> r >> g >> b;

        while(r && g) {
            r--;
            g--;
            counter++;
        }

        while(g && b) {
            g--;
            b--;
            counter++;
        }

        while(r && b) {
            r--;
            b--;
            counter++;
        }

        cout<<counter<<"\n";
    }

    return 0;
}

共有1个答案

咸玄天
2023-03-14

即使您的解决方案得到了纠正,它也可能无法通过对codeforces的所有测试,因为它的时间复杂度与输入数字的值成正比。但是,存在一个解,它的运行时间与输入数无关。

首先,对3输入数字进行排序。如果它们没有排序,那么在每次迭代中,我们将需要找到最大和最小元素,然后递减它们。如果这些数字是排序的,那么我们马上就知道最大和最小的数字在哪里,所以我们可以立即递减它们。

现在,在排序之后,让我们考虑a、b、c的可能情况:a<=b<=c:

3.这种方法可以在O(1)时间复杂度下实现。

...    

int main() {
    int t;
    std::cin >> t;

    for (int i = 0; i < t; i++) {
        std::vector<int32_t> array(3);
        for (int32_t& value : array) {
            std::cin >> value;
        }
        std::sort(array.begin(), array.end());
        int32_t days = 0;

        int32_t diff = array[2] - array[1];
        days += (std::min(array[0], diff));
        array[0] -= days;
        array[2] -= days;

        array[2] -= array[0] / 2;
        days += (array[0] / 2);

        array[1] -= array[0] / 2;
        days += (array[0] / 2);

        days += std::min(array[1], array[2]);

        std::cout << days << std::endl;
    }

    return 0;
}

...
 类似资料:
  • 给出不同整数的列表 我的想法:< br >一种简单的方法是一个接一个地选择一个元素,看看它形成的完美子集的大小,然后我们可以简单地返回最大值。这将是计算密集型的。< br >有什么好的解决方案吗

  • 给定一个数N,我们如何求最大P*Q null 因此,暴力解决方案起作用。 再进一步,我们看到Q_max<=n/2,如果我们确实同意P =√n。 我们可以将我们的解决方案集细化为仅有那些值{P,n\2},其中n\2>=√N。 这可能看起来微不足道,但它只是消除了可能的解决方案集的1/3。 我们是否可以添加其他聪明的程序来进一步减少设置?

  • 我试着写一个代码,它接受一个介于1和1_000_000之间的整数,并返回一个比相同数字的整数大的最小整数,如果它不存在,则打印0。 举个例子 输入:156 输出165 输入330 输出0 输入27711 输出71127 我的问题是,下面的代码没有为其他输入返回正确的输出。 例如,在输入4231中,输出应该是4312。 我很难找到为每个输入返回正确输出的最佳算法。 TNX提前 }

  • 本文向大家介绍C ++中给定乘积的N个整数的最大GCD,包括了C ++中给定乘积的N个整数的最大GCD的使用技巧和注意事项,需要的朋友参考一下 假设我们有两个整数N和P。P是N个未知整数的乘积。我们必须找到这些整数的最大可能GCD。假设N = 3,且P = 24,则不同的组将像{1,1,24},{1,2,12},{1,3,8},{1,4,6},{2 ,2,6},{2,3,4}。GCD为:1、1、1

  • 给定一个无序整数列表,以这种方式打印两个总计为的整数(int 1小于或等于int 2,它们之间用空格隔开)。假设整数列表中总是有的解。int1和int2必须是正整数。 如果有多个解决方案,请打印差异最小的整数对。 例子: 这是我的代码,但是根据我们的编译器(这是我们班的一个练习),我对隐藏的测试用例有错误的输出。 更新:代码工作!

  • 正整数的二进制权重是其二进制表示中1的个数。例如,十进制数1的二进制权重为1,十进制数7(二进制为111)的二进制权重为3。 给定一个正整数N,找出与N具有相同二进制权重的大于N的最小整数。 我的解决方案运行良好,但它的复杂性似乎是O(NlogN)。这可以通过其他方法在O(N)或O(logn)中实现吗?