算法竞赛入门经典——贪心——乘船问题

  1. 乘船问题: 
  2. 有n个人,第i个人重量为Wi。每艘船的最大载重量均为C,且最多只能乘两个(很重要)人。用最少的船装载所有人。 
  3. 怎么思考这样的问题呢?
  4. 1、直观思考:
  5. 很明显我们希望那些瘦子(wi小的人)尽量和胖子或肌肉男(wi大的人)挤一挤,为什么要这样呢,因为这样可以尽可能地省去瘦子占用的船,好,这里涉及到大小,我们可以从小到大排序之,我们希望排在前面的瘦子尽量和排在后面的肌肉男挤一挤。好,基本上,思路就出来了:
  6.    cnt:船的数目
  7. 1、i向->走,j向<-走
  8. 2、如果能凑一起(加起来<=C),则凑一起,j--,i++;
  9. 3、否则,j--
  10. 4、直到i>=j
  11.        i==j -> cnt++;
  12.        i>j  -> cnt;
  13. 但是这样的想法有bug吗?我们可以这样考虑:
  14. 瘦子总要乘一艘船,既然如此,不妨找一个能和他体重之和不超过C的肌肉男(当前wi尽量大的,因为这样才能尽可能保证剩余的人是尽量瘦的(wi尽量小))一起乘一艘船。
  15. 上面就算是直观证明吧。
  16. #include<iostream>
    using namespace std;
    #define Maxsize 10005
    float w[Maxsize];
    /*
    Input(sorted by ascend):
    6 13
    2 3 6 7 11 18
    Output:
    4
    */
    int main()
    {
    	int n,C ,i,j,cnt;
    	//INPUT 
    
    	while(cin >> n&&cin>>C)
    	{ 
    		cnt = 0;
    		
    		for (i = 0;i < n;i++)
    		{
    			cin >> w[i];
    		}
    		if (n == 1)
    		{
    			cout <<1 <<endl;
    			continue;
    		}
    		i = 0, j = n - 1;
    		while (i < j)
    		{
    			if (w[i] + w[j] <= C)
    			{
    				cnt++;
    				i++;
    				j--;
    			}
    			else
    			{
    				cnt++;
    				j--;
    			}
    		}
    		if (i == j)
    			cout << cnt + 1<<endl;
    		else
    			cout << cnt<<endl;
    	}
    	system("pause");
    	return 0;
    }

如有错误,希望各位大佬踊跃猛怼。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值