题意:有三堆石头a b c,让你拿石头,问他最多能拿多少石头。
拿石头规则:1.从a堆拿1个,必须从b堆拿两个。
2.从b堆拿1个,必须从c堆拿两个。
可以无限重复规则1、2。
分为两步:
(1)首先把1进行到底,b堆减去1拿走的石头,在把2进行到底。
(2)首先把2进行到底,b堆减去2拿走的石头,再把1进行到底。
最后输出两步的最大值。
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
pair<ll,ll> p[maxn];
pair<ll,ll> q[maxn];
ll a[500][500];
int main()
{
ios::sync_with_stdio(false);
ll n;
while(cin>>n)
{
ll a,b,c;
for(int i=0;i<n;i++)
{
ll sum1=0,sum2=0;
cin>>a>>b>>c;
ll num1=min(b,c/2);
sum1+=3*num1;
b-=num1;
ll num2=min(a,b/2);
sum1+=3*num2;
ll num3=min(a,b/2);
sum2=3*num3;
b-=num3;
ll num4=min(b,c/2);
sum2+=3*num4;
cout<<max(max(sum1,sum2),(ll)0)<<endl;
}
}
return 0;
}