10pts球条,玄两关
查看原帖
10pts球条,玄两关
737219
YONEX楼主2024/11/27 18:46

拜谢,RT

#include<bits/stdc++.h>
#define ll unsigned long long 
using namespace std;
inline ll read() 
{ 
	char c=getchar();ll x=0,f=1;
	while(c<'0' or c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0' and c<='9'){x=x*10+c-'0';c=getchar();} 
	return x*f; 
} 
ll k[300005];ll step,third,doble;ll ans;
ll x[300005],y[300005];ll num=0,dg=0;
int main() 
{ 
	int t;t=read();ll a;
	for(int ii=1;ii<=t;ii++) 
	{ 
		a=read();step=0;num=0;dg=0;third=0;doble=0;ans=0;
		for(int i=1;i<=a;i++)k[i]=read();
		sort(k+1,k+a+1,greater<int >() );
		for(int i=1;i<=a;i++) 
		{ 
			if(k[i]>4){third+=k[i]/3,y[i]=k[i]%3;num++;if(y[i]==2)doble++;if(y[i]==1)dg++;} 
			else break; 
		}  //>4
		for(int i=1;i<=a;i++){if(k[i]==4)ans++;} //=4
		for(int i=1;i<=a;i++){if(k[i]==3)third++;}//=3
		for(int i=a;i>=1;i--){if(k[i]==1){dg++;}} //=1
		for(int i=1;i<=a;i++){if(k[i]==2)doble++;}//=2 
//		cout<<endl<<ans<<endl<<dg<<endl<<doble<<endl<<third<<endl;cout<<endl;
		for(int i=1;i<=dg;i++){ans++;third--;if(third==0){dg-=i;break;}} //3 and 1
		if(third==0){ans+=dg;ans+=doble;printf("%lld\n",ans);continue;} //hua wan le
		else {doble*=2;if(third>doble){third-=doble;ans+=doble;ans+=(third/4*4+third%4);if(third%4==1)ans++;}
		else {ans+=third;doble-=third;ans+=(doble+1)/2;}}//mei hua wan
		printf("%lld\n",ans);
	} 	
	return 0;
}
2024/11/27 18:46
加载中...