codeforces 158B

codeforces 158B

题目链接

题意

给很多队人,每一队人有不同的人数,用一辆出租车将他们全部送走。题目要求求最小的出租车的数量,因为一辆出租车只能载4个人,所以要找出最优的方案来解决这个问题

思路

用数学、桶来做,或贪心
如果用贪心的话,先不管别的,首先对数据数组排序,
· 将排序后的数组最大的和最小的加在一起,如果值<=4,则下一次不用考虑最大和最小的队伍,载人次数+1
· 因为此时车还没载满,所以根据贪心原则,还要看看能不能再载一队,这时再加上最末尾的最小的人数,载人次数不变
· 如果排序后的数组中最大和最小的加在一起>4,则将最大的一队先送走,下次不用考虑这队,载人次数+1
在这里插入图片描述
方案1(桶,数学)

#include<iostream>
using namespace std;
int A[5],N,i,t;
int main(){
cin>>N;
while(cin>>t)A[t]++;
A[1]=max(A[1]-A[3],0);
cout<<A[3]+A[4]+(A[1]+2*A[2]+3)/4;
}

方案2(贪心)

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
bool cmp(const int&a,const int &b)
{
    return b<a;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    sort(a,a+n,cmp);
    int ans=0;

    for(int i=0;i<n;i++)
    {
        int sum=a[i]+a[n-1];
        if(sum<=4)//如果最大+最小数<=4,车数+1,队伍从右边-2,也就是减最小值;
        {
            ans++;//车数
            n--;//队伍
            while(sum+a[n-1]<=4)
            {
                n--;
                sum+=a[n-1];//如果还有座位,继续加最小值,如果<=4,队伍-1,车数不变
            }
        }
        else ans++;//如果最大值加最小数>4,车数+1,队伍-1(这时队伍从左边减,也就是减最大值,相当于i++)
    }
    cout<<ans;
    return 0;
}

日昭昭月姣姣初心无悔,山迢迢路遥遥勇敢追,夜幕的星山顶的灯,信步相随…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值