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

题解:

我不确定对

思路没错应该

这题感觉n没啥子用

首先用a存储每种小组的个数

4人的小组必定不能与其他小组拼车

所以ans=a【4】

三人的小组可能可以与1人的拼车

二人的小组首先和二人的拼车

如果二人的有余(也就是一个小组)再与一人小组拼车

最后一人小组自己拼车

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
int t,n,m;
using namespace std;
long long  a[5],c,b[200000],sum;
int main()
{
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        a[1]=0;
        a[2]=0;
        a[3]=0;
        a[4]=0;
        for(int i=1;i<=m;i++){
             scanf("%lld",&sum);
            a[sum]++;
        }
        long long ans=a[4];
        ans+=a[3];
        if(a[3]<=a[1]){
            a[1]-=a[3];
        }else{
            a[1]=0;
        }
        ans+=a[2]/2;
        a[2]%=2;
        if(a[2]>0){
            ans++;
            if(a[1]>=2)
                a[1]-=2;
            else if(a[1]>0)
                a[1]--;
        }
        ans=ans+a[1]/4;
        if(a[1]%4)
		ans++ ;
		cout << ans << endl;
    }
    //cout << "Hello world!" << endl;
    return 0;
}

C++版本二

某一AC代码

思路是先排序,最后面的队肯定只用一次,然后从最前面加过来,加到超过4人位置,然后再变一下起止位置。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include  <queue>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <stack>//栈,先进先出
using namespace std;
int a[100000];
int main(int argc, char *argv[])
{
    int t,n,m;//n是人数,m是组数
    cin>>t;
    while(t--)
    {
        int car=0;
        int head,rear;
        cin>>n>>m;
        head=0;
        rear=m-1;
        for(int i=0; i<m; i++)
        {
            scanf("%d",&a[i]);
        }
        sort(a,a+m);
        for(int i=head; i<=rear;)
        {
            int cn=i;
            int total=a[rear];
            if(head==rear)
            {
                car++;
                break;
            }
            while(1)
            {

                if(total+a[cn]<=4)
                {
                    total=a[rear]+a[cn];
                    cn+=1;
                }
                else
                {

                    car++;
                    rear--;
                    head=cn;
                    i=head;
                    break;
                }
            }
        }
        cout<<car<<endl;
    }

return 0;
}