贪心,暴力都可以ac
#include<bits/stdc++.h> using namespace std; int a[10]; int main() { int n,m; while(scanf("%d",&n)==1) { memset(a,0,sizeof(a)); for(int i=0;i<n;i++) { scanf("%d",&m); a[m]++; } int ans=a[5]; int t=min(a[1],a[4]);//1-4 ans+=t,a[1]-=t,a[4]-=t; ans+=a[4]; t=min(a[2],a[3]);//2-3 ans+=t,a[2]-=t,a[3]-=t; t=min(a[3],(a[1]+1)/2);//1-1-3 ans+=t,a[3]-=t,a[1]-=2*t; ans+=a[3]; t=min(a[2]/2,a[1]);//1-2-2 ans+=t,a[2]-=2*t,a[1]-=t; t=min(a[2],(a[1]+2)/3);//1-1-1-2 ans+=t,a[2]-=t,a[1]-=3*t; ans+=(a[2]+1)/2; ans+=(a[1]+4)/5; printf("%d\n",ans); } return 0; }
#include<bits/stdc++.h> using namespace std; int a[10]; int main() { int n,m; while(scanf("%d",&n)==1) { memset(a,0,sizeof(a)); for(int i=0;i<n;i++) scanf("%d",&m),a[m]++; int ans=0; while(n)//只要所有队伍都已经上车即可结束 { ans++; int t=5;//计算每次上车后剩余座位 for(int i=5;i>=1;i--)//枚举每次剩余座位可能 { while(a[i]&&t>=i) a[i]--,t-=i,n--; } } printf("%d\n",ans); } return 0; }