1 条题解
-
0
自动搬运
来自洛谷,原作者为

minstdfx
Believe in the beauty of life, maintain an optimistic attitude, and know that ... is always invincible搬运于
2025-08-24 23:13:21,当前版本为作者最后更新于2025-04-12 23:51:21,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
闲话
这出题人是不是吃拼好饭吃的脑积水了想出来的这题
题解
首先注意到只和每个数的数码 的个数有关。
然后注意到所有 的个数不小于 的数单成一组是不劣的。
接着注意到对 拿尽可能小的数去组二元组是不劣的,因为 只需要且总要和另一个数组。
接下来是 的情况,发现因为 必然此时要和两个组,那么把 打包去和 按照 的贪心去做也同理不劣(边界条件 不优于 )。
接下来对 的情况,由于最多要三元组所以不能 ,首先 不劣于 ,然后 不劣于 (因为 没有 就废了)。
对于只有 的情况,有一个上界是 ,枚举两个 cnt 的余数发现是紧的。
否则 是没有用的。
然后就做完了。
a,b,c,d,e,f,g,d,_,*p;main(C){scanf("%*d");for(;~C;)(C=getchar())<48?(++*(&a+_),_=0):(_+=C==54&&_<6);for(p=&b;f>0;)_=1+(p==&f),(*p<_||(++g,--f,--*p)<_)&&++p;for(p=&b;e>0;)_=1+(p==&b||p==&e),(*p<_||(++g,p<&e&&--e,*p-=_)<_)&&++p;for(;b*d*c;--b,--d,--c)++g;printf("%d",g+(3*d+2*c)/6);}什么,看不懂吗?
int main() { cin>>n; for(int i=1,a;i<=n;++i) cin>>a,c[count6(a)]+=1; int ans=c[6]; int ptr=1; while(c[5]>0) { int cc=(ptr==5)+1; if(cc>c[ptr] || (++ans,c[5]-=1,c[ptr]-=1)<cc) ++ptr; } while(c[4]>0 && c[1]>1) { --c[4]; --c[1]; --c[1]; ++ans; } ptr=2; while(c[4]>0) { int cc=(ptr==4)+1; if(cc>c[ptr] || (++ans,c[4]-=1,c[ptr]-=1)<cc) ++ptr; } while(c[3] && c[2] && c[1]) { --c[3]; --c[2]; --c[1]; ans++; } ans+=(3*c[3]+2*c[2])/6; }
- 1
信息
- ID
- 12018
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者