几天前,我试图解决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
。通过法官的其他解决方案将上述两个循环互换。
虽然我理解了失败的示例,但我无法直观地理解通过交换两个循环所实现的区别-为什么必须在堆B
和C
上工作首先,在研究A
和B
之前?有人可以解释一下吗?
谢谢。
注意:我已经从问题中删除了该问题实际不需要的其他详细信息。
答案 0 :(得分:0)
如果您考虑B
中宝石的值,则每颗宝石等同于C
中的两颗宝石,但每颗宝石都来自A
中的宝石等效于B
的两块石头,而C
的两块石头都不是。
因此,为了最大程度地增加结石数量,您想先从B
取石,然后再从A
取石。