40pts求助(玄关)
查看原帖
40pts求助(玄关)
47911
xiaozhangma楼主2024/11/24 18:13

思路貌似是对的,最后一个样例第一组过不去

#include<bits/stdc++.h>
#define LL long long
#define F(x,s,t) for(int x=s;x<=t;x++)
using namespace std;
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
const int N = 3e5 + 10;
int n;
LL a[N];
int main(){
	//freopen("card.in","r",stdin);
	//freopen("card.out","w",stdout);
	int T = read();
	while(T -- ){
		n = read();
		F(i, 1, n)a[i] = read();
		LL cnt = 0;
		F(i, 1, n){
			cnt += a[i] / 3;
			a[i] %= 3;
		}
		LL ans = cnt;
		F(i ,1, n){
			if(cnt < 1)break;
			if(a[i] == 1){
				cnt -- ;
				a[i] = 0;
			}
		}
		F(i, 1, n){
			if(cnt < 1)break;
			if(a[i] == 2){
				if(cnt == 1){
					cnt --;
					a[i] = 1;
				}else{
					cnt -= 2;
					a[i] = 0;
				}
			}
		}
		F(i, 1, n){
			if(a[i])ans ++ ;
		}
		if(cnt){
			ans -= cnt;
			ans += (cnt) / 4 * 3;
			cnt %= 4;
			if(cnt <= 2)ans += 2;
			if(cnt == 3)ans += 3;
		}
		printf("%lld\n", ans);
	}
	return 0;
}

2024/11/24 18:13
加载中...