社区讨论
求证伪或hack(玄关)
P11323【MX-S7-T1】「SMOI-R2」Happy Card参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m3vb6ahb
- 此快照首次捕获于
- 2024/11/24 15:59 去年
- 此快照最后确认于
- 2025/11/04 14:01 4 个月前
思路有些奇怪,如下:
从小到大排序,把v一直拆出3和1配对,若v还有剩余,就继续和2配对,若还有剩余,且当前有3未被配对则v拆出1和3配对,若还有剩余,则v拆成王炸形式,(好奇怪思路但是测了好多组数据都是对的,感觉就是拆出1的那步不知道正确性,求证伪或hack谢谢)
代码如下:
CPP#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+10;
int v[N],t1,t2,t3,cnt;
void check(int x){
if(x==0) return;
if(x==1) ++t1;
if(x==2) ++t2;
if(x==3){
if(t1) ++cnt,--t1;
else ++t3;
}
if(x==4) ++cnt;
if(x<=4) return;
int now=x/3;
if(now%2) --now;
if(now/2>=t2){
cnt+=t2*2;
x-=t2*6;
t2=0;
}
else{
t2-=now/2;
cnt+=now;
x-=now*3;
}
if(t2&&x>=3){
x-=3,t2--,t1++,++cnt;
}
if(t3){
if(t3>=t1) t3-=t1;
if(t3>=x) t3-=x,cnt+=x,x=0;
else cnt+=t3,x-=t3,t3=0;
}
int k=x/4;
cnt+=k;
x-=k*4;
if(x==3) ++t3;
else if(x==2) ++t2;
else if(x==1) ++t1;
return;
}
signed main(){
//freopen("card3.in","r",stdin);
//freopen("card3.out","w",stdout);
int T;cin>>T;
while(T--){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>v[i];
}
sort(v+1,v+n+1);
t1=t2=t3=cnt=0;
for(int i=1;i<=n;i++){
if(v[i]<=4){
check(v[i]);
continue;
}
if(t1){
/*if((v[i]-4)%3==0){
int now=(v[i]-4)/3;
if(now<t1){
t1-=now;
cnt+=now+1;
}
else{
cnt+=t1;
v[i]-=t1*3;
t1=0;
check(v[i]);
}
continue;
}*/
int now=v[i]/3;
if(now<t1){
cnt+=now;
t1-=now;
v[i]-=now*3;
check(v[i]);
}
else{
cnt+=t1;
v[i]-=t1*3;
t1=0;
check(v[i]);
}
continue;
}
check(v[i]);
}
//cout<<t1<<" "<<t2<<" "<<t3<<endl;
if(t3>=t1) cnt+=t1,t3-=t1,t1=0;
else cnt+=t3,t1-=t3,t3=0;
if(!t3) cnt+=t1+t2;
else{
if(t3/2>=t2){
cnt+=t2;
t3-=t2*2;
cnt+=(t3/4)*3;
if(t3%4==1||t3%4==2) cnt+=2;
else if(t3%4==3) cnt+=3;
}
else{
cnt+=t3/2*2;
t2-=t3/2;
if(t3%2) ++cnt;
cnt+=t2;
}
}
cout<<cnt<<endl;
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...