对没错是新生赛题,wa了五次,写了快两小时
:题目链接
情况很多:23,14,5,1…1,112,12,22,2,113,13,3,4。很多情况是不会同时出现。
我又细分了三种情况在只剩下1,2的时候。
#include<stdio.h>
#include<string.h>
int num[6];
int main(){
int n,x;
while(scanf("%d",&n)!=EOF&&n){
memset(num,0,sizeof num);
for(int i=1;i<=n;++i){
scanf("%d",&x);
++num[x];
}
int ans=0;
if(num[1]>num[4]){
ans+=num[4];num[1]-=num[4];
if(num[2]>num[3]){
ans+=num[3];num[2]-=num[3];
if(num[2]*3<=num[1]){
ans+=num[2];num[1]-=num[2]*3;num[2]=0;
ans+=num[1]/5;
if(num[1]%5) ++ans;
}
else if(num[2]%2==0){
ans+=num[2]/2;num[1]-=num[2]/2;num[2]=0;
if(num[1]>0){
ans+=num[1]/5;
if(num[1]%5) ++ans;
}
}
else if(num[2]%2==1){
ans+=num[2]/2+1;num[1]-=(num[2]/2+3);
if(num[1]>0){
ans+=num[1]/5;
if(num[1]%5) ++ans;
}
}
}
else {
ans+=num[2];num[3]-=num[2];
ans+=num[3];num[1]-=num[3]*2;
if(num[1]>0){
ans+=num[1]/5;
if(num[1]%5) ++ans;
}
}
}
else {
num[4]-=num[1];
ans+=num[1];
if(num[2]>num[3]){
ans+=num[3];num[2]-=num[3];
ans+=num[4]+num[2]/2;
if(num[2]%2==1) {
++ans;
}
}
else {
ans+=num[3]+num[4];
}
}
ans+=num[5];
printf("%d\n",ans);
}
return 0;
}
我感觉我写的不好,如果有更简单的写法,欢迎在评论指出