【hoj】2160 bin packing 二分、贪心

这个题是在二分的题单上的,可是依据二分法写出来的会在oj上超时。依据题目以下给出的提示能够发现能通过贪心法每次都找最能满足的情况去填充每个包,这样就能保证使用的包的数量是最少的

二分法解法:

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#define MAX 100000

using namespace std;
int n,length;
int l[MAX];
bool cmp(int a,int b)
{
    return a<b;
}
bool judge(int mid)
{
    int r = 0,q = 0;
    int max = 0;
    int tag[n];//标记该物是否之前就打包过了
    memset(tag,0,sizeof(tag));
    for(int i = 0;i < n;i++){
        r = length - l[i];
        max = i;
        for(int j = n-1;j > i;j--){
            if((l[j] < r) &&!tag[j]){//尽量找到最能填满剩余空间的物
                max = j;
                break;
            }
        }
        if(!tag[max]){
            q++;
            tag[max] = 1;
        }
    }
    if(q < mid)
        return false;
    else
        return true;
}
int main()
{
    int high,low,mid,res;
    while(cin>>n){
    cin>>length;
    for(int i = 0;i < n;i++){
        cin>>l[i];
    }
    sort(l,l+n,cmp);
    high = n;
    low = 0;
    res = 0;
    while(low <= high){
        mid = (low+high)/2;
        if(judge(mid)){
            res = mid;
            low = mid+1;
        }
        else
            high = mid-1;
    }
    cout<<res<<endl;
    }
    return 0;
}

贪心法解法:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;

int li[100003];
int ca[100003];

bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
    int n;
    int l;

    while(scanf("%d",&n)!=EOF)
    {
        scanf("%d",&l);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&li[i]);
            ca[i] = l;
        }

        sort(li,li+n,cmp);

        int ans = 0;
        for(int i=0,j=n-1;i<=j;i++)
        {
            if(li[i] + li[j] <= l)
            {
                j--;
            }
            ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-10-24 03:39:35

【hoj】2160 bin packing 二分、贪心的相关文章

UVA 1149 Bin Packing 二分+贪心

A set of n 1-dimensional items have to be packed in identical bins. All bins have exactly the samelength l and each item i has length li ≤ l. We look for a minimal number of bins q such that• each bin contains at most 2 items,• each item is packed in

UVA-1149 Bin Packing (贪心)

题目大意:给定n个物品的重量,无限个容量为m的箱子,每个箱子最多装两个物品,要把所有的物品都装下,最少需要多少个箱子. 题目分析:贪心策略:每次将最重和最轻的两个物品放到一个箱子里,如果装不下,则将最重的单独装到一个箱子里. 代码如下: # include<iostream> # include<cstdio> # include<cstring> # include<algorithm> using namespace std; int a[100005]

UVA 1149 Bin Packing 装箱(贪心,水)

每次选最大的物品和最小的物品放一起,如果放不下,大物体孤独终生,否则相伴而行... #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+42; int a[maxn]; template<class T> inline void scan_d(T *ret) { char c;*ret=0; while((c=getchar())<'0'||c>'9'); while(c>='0'&a

贪心(bnuoj49103+二分+贪心)

贪心 小明喜欢养小鸡,小鸡喜欢吃小米.小明很贪心,希望养s只不同种类的小鸡,小鸡也很贪心,每天除了吃固定的ai粒小米外,还想多吃bi*s粒小米. 小明每天有M(0<=M<=10^9)粒小米可以喂小鸡,小鸡共有N(0<=N<=1000)种.问小明最多可以养多少只小鸡? Input 多组数据,请读到文件尾 第一行,整数N,M,以空格分隔,之后两行,第一行为N个整数ai,第二行为N个整数bi. ai.bi都在int范围内 Output 一行一个整数,s. Sample Input 2 4

POJ 2782 Bin Packing

 Bin Packing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5416   Accepted: 2452 Description A set of n 1-dimensional items have to be packed in identical bins. All bins have exactly the same length l and each item i has length li<=l

二分+贪心

上海邀请赛热身时候,C题是一个二分+贪心的题目.起初并不会,问了旁边的复旦大神.这几天无意发现VJ上一个专题.擦原来是一个经典类型. 二分+贪心 这类题目注意数据范围,1e8,1e9一般都是这样. 注意事项 二分法有很多写法,推荐用lf+1 < rf的写法.这个也符合计算机中数据存取的原则.对于浮点数,直接就循环100次,精度绝对够. 一般有两种类型,一种是询问最优,即数列中无重复.一种是多个即lower_bound ,upper_bound这类函数问题. 贪心使用,就是这个问题枚举答案可被验证

nyoj586||poj2456 二分+贪心

完全看不懂题意....百度搜搜才看懂题意  然后就参考代码了 和yougth的最大化()nyoj914差不多的方法 二分+贪心 #include <stdio.h> #include <algorithm> using namespace std; int c,a[100005],n; bool judge(int k) { int p=a[0],cnt=1;//也就这里注意点 从1开始 自己想想为啥 for(int i=1;i<n;i++) { if(a[i]-p>=

HDU 4004 The Frog&#39;s Games 二分 贪心

戳这里:HDU 4004 //思路:二分经典入门题...贪心判方案是否可行 1 #include "bits/stdc++.h" 2 using namespace std; 3 int L, n, m; 4 int pos[500010], dis[500010]; 5 6 bool Cant(int Dis_Jump) 7 { 8 int i, Dis_Sum = 0, Count = 0; 9 for(i = 1; i <= n + 1; ++i) { 10 if(dis[

poj1505Copying Books 二分+贪心详细总结

前两天花了时间理解了nyoj的586疯牛和nyoj619青蛙过河,满以为自己能重新写出这道题...谁知道..... 题意:有m本书,k个人来抄,每本书有一个书本页数:求使得k个人抄完的最大页数最小,并且每个人都至少要抄一本,然后输出抄书的方案 分析: 这里又涉及到前面nyoj的586疯牛和nyoj619青蛙过河说过的最大值中的最小值,  用前面的例子去理解比较方便 1.我们应该先用二分+贪心算出一个最大页数的最小值--这里和前面的类似 在二分的过程中,我们对于当前考虑的值 x  划分人数的贪心过