车辆问题(贪心)
链接:https://www.nowcoder.com/acm/contest/112/B
有n个队伍,每个队伍的人数小于等于5,每辆车最多坐5个人,要求一个队伍的人都在一辆车上,求最少的车数
输入描述:
第一行n
第二行n个数,表示每个队伍的人数
输出描述:
输出最少车数
示例1
输入
3 3 4 5
输出
3
备注:
n≤1e5
每个数小于等于5
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) ((a,0,sizeof(a))) typedef long long ll; int n,a[7],x,ans=0; void check(int x,int y) { int pos; pos=min((a[x]*x)/(5-y),a[y]); ans+=pos; a[x]-=pos*((5-y)/x); a[y]-=pos; } int main() { scanf("%d",&n); memset(a,0,sizeof(a)); for(int i=0;i<n;i++) { scanf("%d",&x); a[x]++; } ans+=a[5]; a[5]-=ans; check(1,4); check(2,3); check(2,1); check(1,2); check(1,3); if(a[1] && a[2]) ans++,a[1]--,a[2]--; if(a[1] && a[3]) ans++,a[1]--,a[3]--; printf("%d\n",ans+(a[1]/5+(a[1]%5==0?0:1))+(a[2]/2+(a[2]%2==0?0:1))+a[3]+a[4]+a[5]); return 0; }