贪心算法,每次都拿取符合条件的个数最多的那堆火药
#include <iostream>
#include <cstdio>
using namespace std;
//寻找主体火药最大值的位置
int zfind(int a[],int n,int bef)
{
int big=a[0],p=0;
for(int i=1;i<n;i++)
{
if(i!=bef)
{
if(a[i]>big)
{
big=a[i];
p=i;
}
}
}
return p;
}
//寻找主体火药最大值的位置
int find(int a[],int n)
{
int big=a[0],p=0;
for(int i=1;i<n;i++)
{
if(a[i]>big)
{
big=a[i];
p=i;
}
}
return p;
}
int main()
{
int now=0,T;
cin>>T;
while(now<T)
{
int n,num=0;;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
int bf=-1;//记录骑士前一个拿的主题火药
int p;//位置
for(;;)
{
//为骑士寻找主体火药
bf=zfind(a,n,bf);
if(a[bf]==0) break;
a[bf]--;
//我们拿走一个
p=find(a,n);
if(a[p]==0) break;
a[p]--;
num++;
//为骑士寻找点火药
p=find(a,n);
if(a[p]==0) break;
a[p]--;
//我们拿走一个
p=find(a,n);
if(a[p]==0) break;
a[p]--;
num++;
}
printf("Case #%d: %d\n",++now,num);
}
return 0;
}