题解:P12168 [蓝桥杯 2024 省 C] 拼好数
闲话
这出题人是不是吃拼好饭吃的脑积水了想出来的这题
题解
首先注意到只和每个数的数码
然后注意到所有
接着注意到对
接下来是
接下来对
对于只有
否则
然后就做完了。
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;
}