题解:P11323 【MX-S7-T1】「SMOI-R2」Happy Card
题目链接:P11323 【MX-S7-T1】「SMOI-R2」Happy Card
思路:贪心,这里有两个比较相似的操作,即炸和三带一,对于炸操作可以看成同类牌的一种三带一,因此我们只需要尽可能地完成三带一操作即可,不难发现对于任意大于等于
在下述表达中记
情况一:
情况二:
代码如下:
#include<algorithm>
#include<iostream>
#include<string.h>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define int long long
#define lb(a,b,n) (lower_bound((a)+1,(a)+1+(n),(b))-(a))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define inf 0x3f3f3f3f
#define llinf 1e18
#define debug cout<<"wwwwwww"
#define xx return
const int N=3e5+10;
int T;
int n;
int v[N];
namespace xx_Tx{
void solve(){
int cnt1=0,cnt2=0,cnt3=0;
rep(i,1,n){
cnt3+=v[i]/3;
if(v[i]%3==1)cnt1++;
if(v[i]%3==2)cnt2++;
}
int ans=0;
if(cnt3<=2*cnt2+cnt1){
if(cnt3<=cnt1)cout<<ans+cnt1+cnt2<<endl;
else{
cnt3-=cnt1;
ans+=cnt2-cnt3/2+cnt3+cnt1;
cout<<ans<<endl;
}
}
else{
ans+=(cnt1+2*cnt2);
cnt3-=(2*cnt2+cnt1);
ans+=ceil(cnt3*3.0/4.0)+(cnt3%4==1?1:0);
cout<<ans<<endl;
}
xx;
}
}
namespace Main_xx{
void Main(){
cin>>T;
while(T--){
cin>>n;
rep(i,1,n)cin>>v[i];
xx_Tx::solve();
}
xx;
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
Main_xx::Main();
xx 0;
}