今天浙大校赛最水的一道题,纯模拟……具体见代码……
#include<iostream>
#include<cstdio>
using namespace std;
template<class T> T Max(T x,T y){return x>y?x:y;}
template<class T> T Min(T x,T y){return x<y?x:y;}
int main()
{
long long i,l,n,d,x,a[3]; //这里不能用int,因为已超范围。而浙大只能用long long,为此CE一次,以后切记
while(scanf("%lld",&n)!=EOF)
{
l=a[1]=a[2]=0;
for(i=0;i<n;i++)
{
scanf("%lld",&x);
a[x%3]++; //能减去3的都减,并记录剩下多少1和2
l+=x/3;
}
d=l;
while(a[2])
{
x=Min(a[2],d); //加1去把所有的2减去
l+=x;
a[2]-=x;
}
while(1)
{
if(a[1])
{
x=Min(a[1],d/2); //加2把所有的1减去
a[1]-=x;
d-=x;
}
else //本来的都减去了,就另外处理+1多出的数
{
x=d/3;
d-=x*2;
}
l+=x;
if((a[1]==0&&d<=2)||(a[1]&&d<2))break; //如果不能再减下去就结束
}
printf("%lld\n",l);
}
return 0;
}