CSU 1775:悲催的移寝(贪心)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xp731574722/article/details/76566284

悲催的移寝

Time limit:1000 ms Memory limit:131072 kB


Problem Description

对于csuxushu来说,能够在CSU(California State University)上学是他一生的荣幸,而换校区搬寝室则是他最大的不幸。顺利通过省赛选拔,开心的csuxushu现在需要着手准备搬家事宜。
对于好学的csuxushu来说,唯一头疼的就是书籍的搬运了,因为他的书实在是太多了。为了防止书籍在运输过程中受损,他打算定制特制的储物保护箱。为了简单起见,我们假设他所有的书都是一样规格。由于是批量定制,这些储物箱都有相同的长度L,宽度和厚度都是一本书的宽度和厚度。csuxushu有一个特殊的要求,那就是每个储物箱最多只能放两本书。当然,他需要运走所有的N本书,并且每一个储物箱里书的总长度不能超过L。
尽管校队队员给了csuxushu许多奖励,csuxushu还是想定尽可能少的储物箱,以求节约经费,然而面对这么困难的问题他显然是一脸懵逼,这时候他想到了你——全CSU最厉害的程序员来帮助他解决这个问题。

Input

第一行一个整数T,代表有T组数据,之后一个空行并且接下来每两组数据之间有一个空行。
每组数据第一行,为1个整数n (1 ≤ n ≤ 10^5),代表有n本书。第二行,为1个整数L ,1≤l ≤ 10000 ,为特制储物箱长度。接下来n行,分别为每本书的长度li,li≤l。

Output

每组数据输出一行,即csuxushu至少需要定多少储物箱。相邻两组数据之间输出一个空行以示区分。

Sample Input

1

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

Sample Output

6

Hint

这里写图片描述


解题思路:

直接贪心。。根据书的长度排序,一边从左往右,一边从右往左,配对,如果和小于L就成功,否则右边的继续往左走。最后直接用书的总数减去配对的书的数量就可以得到答案了


Code:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

const int maxn=1e5+5;
int a[maxn];


int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,l;
        scanf("%d%d",&n,&l);
        for(int i=0;i<n;i++)
        {
            scanf("%d",a+i);
        }
        sort(a,a+n);

        int cnt=0,len=n-1;
        for(int i=0;a[i]&&i<n;i++)
        {
            while(a[len]+a[i]>l&&a[len]!=0)
            {
                len--;
            }
            if(a[len]+a[i]<=l&&a[len]!=0&&i!=len)
            {
                a[len]=0;
                len--;
                a[i]=0;
                cnt++;
            }
        }
        printf("%d\n",n-cnt);
        if(T!=0)
            printf("\n");
    }

    return 0;
}
展开阅读全文

没有更多推荐了,返回首页