codeforce 158B (贪心)

传送门:http://codeforces.com/problemset/problem/158/B

题意分析:

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

具体思路:

碰到贪心问题,先不管别的,首先对数据数组进行排序,方便后续问题的处理。最优的方案是:

  • 将排序后的数组中最大的和最小的加在一起,如果值<=4,则下一次不用考虑最大和最小的队伍,载人次数+1
  • 因为此时车还没载满,所以根据贪心原则,还要看看能不能再载一队。这时再加上最末尾的最小人数,载人次数不变,
  • 如果排序后的数组中最大和最小的加在一起 > 4,则将最大的一队先送走,下次不用考虑这队,载人次数+1

源代码

#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(void){
	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++;		//如果最大加最小数大于1,车数+1,队伍-1(这时队伍减1减的数组的左边,这里相当于i++)。 
	}	
	cout<<ans;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值