装木块问题

Description

有一种很特别装箱子,箱子的所有长度都是L,还有N根木块,所有木块的长度都小于等于L,箱子可以装木块,但是有如下限制: 1.每个箱子只能装一根或两根木块。 2.如果装两根必须使得这两根木块的长度之和小于等于箱子的长度L。 你的任务是求出最少需要多少个这样的箱子才能装下所有的木块。

Input

第一行一个N,表示有N根木块。(1<=N<=105) 第二行一个L,表示箱子的长度。L<=10000 接下来N行,每行一个正整数,表示木块的长度。

Output

只有一行,最少需要的箱子数。

Sample Input

10
80
70
15
30
35
10
80
20
35
10
30

Sample Output

6
KEY:不是什么难题……但是wa好几次……居然是数组开小了……丢人啊……
#include<iostream>

#include<algorithm>

using namespace std;



int a[100001];

int N;

int L;

int MAX;





void input()

{

	for(int i=1;i<=N;i++)

		cin>>a[i];

}



void countmax()

{

	MAX=0;

	int i=1,j=N;

	while(i<=j)

	{

		if(i==j)

		{

			MAX++;

			return ;

		}

		if(a[j]+a[i]<=L)

		{

			MAX++;

			j--;

			i++;

		}

		else

		{

			if(a[j]<=L)

			{

				MAX++;

				j--;

			}

		}

	}

}



int main()

{

//	freopen("fjnu_1992.in","r",stdin);

	while(cin>>N)

	{

		cin>>L;

		input();

		sort(a+1,a+N+1);

		countmax();

		cout<<MAX<<endl;

	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值