第五个点超级的坑 疯狂wa
主要的那个循环中 i代表了用了多少缩小药
拉人是先拉2 再拉1 最后拉3
flag[i]代表 %3==i的随从拉了几个
最后ans处理详见以下样例
7 7
3 3 4 4 4 5 5
7 9
3 4 5 4 5 4 5
7 9
3 3 5 5 5 5 5
就是用完最后一瓶缩小药可以处理完之后 估计还会有一些1和2的随从没有拉 可以用它们来代替之前拉的3的随从
#include<bits/stdc++.h>
using namespace std;
int n,m,i,x,j,mx,ans,a[30005],flag[4];
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(i=1;i<=n;++i)
cin>>x,++a[x],mx=max(x,mx);
if(m==0){
cout<<"0 0";
return 0;
}
for(i=0;i*3<mx;++i){
for(j=1;j<4;++j) a[j]=a[j+i*3];
x=m/2+m%2;
if(x>a[2]&&!(x-1==a[2]&&a[1]&&m%2))m-=2*a[2],ans+=a[2],flag[2]+=a[2],a[2]=0;else{
if(m%2&&a[1]) --x,--m,--a[1],++ans;
ans+=x;m-=x*2;flag[2]+=x;a[2]-=x;break;}
if(m>a[1]) m-=a[1],ans+=a[1],flag[1]+=a[1],a[1]=0;else{
ans+=m;m=0;flag[1]+=m;a[1]-=m;break;}
if(m%3) x=m/3+1;else x=m/3;
if(x>a[3]) m-=a[3]*3,ans+=a[3]*4,flag[3]+=a[3];else{
ans+=x*4;m-=x*3,flag[3]+=x;break;}
}
if(i*3>=mx) cout<<"Human Cannot Win Dog\n";else{
if(a[2]%3==2&&a[1]%3==0) a[1]++,a[2]--;
x=min(a[1],a[2]%3);
if(flag[3]>x){
flag[3]-=x;ans-=x*2;a[2]-=x;a[1]-=x;
if(flag[3]>a[2]*2/3){
flag[3]-=a[2]*2/3;ans-=(a[2]*2/3*4-a[2]);
ans-=min(flag[3],a[1]/3);
}else ans-=(flag[3]*4-flag[3]*3/2);
}else{
if(a[i]/3>0) ans-=(flag[3]*4-(flag[3]*3/2+flag[3]*3%2));else
ans-=flag[3]*2;
}
if(m==-1&&flag[1]) --ans;
if(m==-2){if(flag[1]>=2) ans-=2;else if(flag[2]||flag[1]) --ans;}
cout<<i<<" "<<ans+i;
}
return 0;
}