问题 C: PIPI捡垃圾
题目描述
PIPI参加志愿者活动去沙滩上捡垃圾,已知沙滩上有 N 堆垃圾,每个垃圾的重量为 L,PIPI的垃圾袋容量为 M,一个垃圾袋最多能装两个垃圾(大与小相配)。问: PIPI最少需要多少个垃圾袋才能把垃圾全带走?
输入
第一行包含一个正整数T代表测试样例组数。
对于每组测试用例,第一行包含两个正整数 N和 M(N<=105,M<=109)。
第二行包含 N 个正整数代表每一个垃圾的重量。
输出
对于每组样例,输出包含一个正整数代表最少需要的垃圾袋数目。除了最后一组样例,每两组样例间有一个空行。
样例输入
1 3 2 1 2 2
样例输出
#include<stdio.h>
void quick_sort(int num[], int low, int high )//快排
{
int i,j,temp;
int tmp;
i = low;
j = high;
tmp = num[low]; //任命为中间分界线,左边比他小,右边比他大,通常第一个元素是基准数
if(i > j) //如果下标i大于下标j,函数结束运行
{
return;
}
while(i != j)
{
while(num[j] >= tmp && j > i)
{
j--;
}
while(num[i] <= tmp && j > i)
{
i++;
}
if(j > i)
{
temp = num[j];
num[j] = num[i];
num[i] = temp;
}
}
num[low] = num[i];
num[i] = tmp;
quick_sort(num,low,i-1);
quick_sort(num,i+1,high);
}
int main()
{
int t=0;
scanf("%d",&t);
for(int i=0;i<t;i++)
{
int n=0,m=0;
scanf("%d%d",&n,&m);
int cnt=0;
int l[100005]={0};
for(int j=0;j<n;j++)
{
scanf("%d",&l[j]);
}
//printf("%d\n",cnt);
quick_sort(l,0,n-1);
int p=0,q=n-1;
while(p<=q)
{
if(p==q) //只剩下1个。
{
cnt++;
break;
}
if(l[p]+l[q]<=m)
{
cnt++;
p++;
q--;
}
else
{
cnt++;
q--;
}
}
if(i==0)
printf("%d\n",cnt);
else
printf("\n%d\n",cnt);
}
return 0;
}
3