S10的春游出行计划

Problem:S10的春游出行计划

Description:
计算机学院辅导员要求S10策划一次春游活动
学院有n个同学,被分成m个小组,每个小组的人数不超过4人。
现在有一种汽车,每辆车最多坐4人,可以不坐满,要求同一小组的同学必须坐在同一辆车上,而一辆车可以载上来自多个不同小组的同学。
问最少需要多少辆车,能够满足这次的春游计划。

Input:
多组数据,第一行给出数据组数T(1≤T≤5000)
每组数据首先给出两个整数n和m (1≤n,m≤1e5)
随后一行有m个整数,a1,a2,a3…am表示每个小组的人数。(1≤ai≤4)

Output:
每一组数据输出一个整数,表示春游出行最少需要的车辆

Sample Input:
2
10 4
1 2 3 4
7 4
1 2 2 2

Sample Output:
3
2

Language:C++

#include <iostream>

using namespace std;

const int N=100010;

int main()
{
  int T;
  cin>>T;
  while(T--)
  {
    int n,m;
    cin>>n>>m;
    int a[N];
    int one=0,two=0,three=0,four=0;
    for(int i=1;i<=m;i++)
    {
      cin>>a[i];
      if(a[i]==1) one++;
      if(a[i]==2) two++;
      if(a[i]==3) three++;
      if(a[i]==4) four++;
    }

    int car;
    if(three)
    {
       if(one<=three) car=two+three+four;
       else
      {
         if((one-three+1)/2<=two)  car=two+three+four;
         else  car=(one-three-two*2+3)/4+two+three+four;
      }
    }

    else
    {
      if(two%2) car=(one-2+3)/4+(two/2+1)+three+four;
      else  car=(one+3)/4+two/2+three+four;
    }

    cout<<car<<'\n';
  }
  return 0;
}   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值