在第一堆和第二堆上与第二堆和第三堆上进行逻辑上的区别

时间:2019-11-05 05:25:21

标签: c++ algorithm

几天前,我试图解决CodeForces的问题:

  

有三堆石头,分别是A,B和C。我们可以从A去除1块石头,然后从B去除2块石头;或B中的1个,然后C中的2个。给定每个堆中的结石数量,返回可以去除的最大结石数量。例如,在3,4,5的情况下,可以清除的最大结石数量为9-首先是B的2个和C的4个,然后是A的1个和B的2个。 >

我编写了代码,其中我从B除去2的倍数,从A除去单数,然后从C除去2的倍数,从B除去单数,如下所示:

#include<algorithm>
#include<cstdio>
#include<iostream>

using namespace std;

int main() {
    int n;
    cin >> n;
    ios_base::sync_with_stdio(false);
    cin.tie(null);

    while(--n) {
        int a, b, c, ans=0;
        cin >> a >> b >> c;

        while(a>=1 && b>=2) {     //This one
            a--;
            b-=2;
            ans+=3;
        }

        while(b>=1 && c>=2) {     //That one
            b--;
            c-=2;
            ans+=3;
        }

        cout<<ans<<"\n";
    }

    return 0;
}

这与上面给出的示例3,4,5不同-我的输出是6而不是9。通过法官的其他解决方案将上述两个循环互换。

虽然我理解了失败的示例,但我无法直观地理解通过交换两个循环所实现的区别-为什么必须在堆BC上工作首先,在研究AB之前?有人可以解释一下吗?

谢谢。

注意:我已经从问题中删除了该问题实际不需要的其他详细信息。

1 个答案:

答案 0 :(得分:0)

如果您考虑B中宝石的值,则每颗宝石等同于C中的两颗宝石,每颗宝石都来自A中的宝石等效于B的两块石头,而C的两块石头都不是。

因此,为了最大程度地增加结石数量,您想先从B取石,然后再从A取石。