zoukankan      html  css  js  c++  java
  • 另类装载问题

    装载问题

    时限:1000ms 内存限制:10000K  总时限:3000ms

    描述:

    有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。

    输入:

    多个测例,每个测例的输入占两行。第一行一次是c1、c2和n(n<=10);第二行n个整数表示wi (i=1…n)。n等于0标志输入结束。

    输出:

    对于每个测例在单独的一行内输出Yes或No。

    输入样例:

    7 8 2 8 7 7 9 2 8 8 0 0 0

    输出样例:

    Yes No

    提示:

    求出不超过c1的最大值max,若总重量-max < c2则能装入到两艘船。

    思路:将当前船的容量按从大到小排序,货物从大到小排序,直到最大的货物无法放入到剩余空间最大的船只上或所有货物都放到船上。

    #include <iostream>
    using namespace std;
    
    void Keep_heap(int *good,int key,int num)
    {
        int left=key*2;
        int right=key*2+1;
        int max=key;
        if(left<=num&&good[key]>good[left])
        max=left;
        if(right<=num&&good[max]>good[right])
        max=right;
        if(max!=key)
        {
            int temp=good[key];
            good[key]=good[max];
            good[max]=temp;
            Keep_heap(good,max,num);
        }
    }
    
    void BuildHeap(int *good,int num)
    {
        for(int i=num/2;i>=1;i--)
        Keep_heap(good,i,num);
    }
    void HeapSort(int *good,int num)
    {
        BuildHeap(good,num);
        for(int i=num;i>=2;i--)
        {
            int temp=good[1];
            good[1]=good[i];
            good[i]=temp;
            num-=1;
            Keep_heap(good,1,num);
        }
    }
    
    int main()
    {
        while(true)
        {
            int c1,c2,num,flag=1;
            cin>>c1>>c2>>num;
            if(c1==0&&c2==0&&num==0)
            break;
            int *good=new int[num+1];
            for(int i=0;i<num;i++)
            cin>>good[i+1];
            HeapSort(good,num);
            int i;
            for(i=1;i<=num&&(c1>=0);i++)
            {
                if(c1>=c2)         //使得c1为最大的
                ;
                else
                {
                    int temp=c1;
                    c1=c2;
                    c2=temp;
                }
                //cout<<c1<<"  "<<good[i]<<endl;
                if(c1>=good[i])
                c1-=good[i];
                else
                {
                    cout<<"No"<<endl;
                    flag=0;
                    break;
                }
            }
            if(!flag)
            continue;
    
            if(i==num+1)
            cout<<"Yes"<<endl;
            else
            cout<<"No"<<endl;
    
        }
           // return;
    }
    

      

  • 相关阅读:
    Clojure实现的简单短网址服务(Compojure、Ring、Korma库演示样例)
    android4.4系统解决“ERRORcouldn&#39;t find native method”方法
    JS window.open()属性
    网页视频播放器代码大全 + 21个为您的站点和博客提供的免费视频播放器
    理解Java的GC日志
    图像识别技术
    堆排序原理及算法实现(最大堆)
    什么是依赖注入
    Cocos2d-x3.1下实现相似iOS页面滑动指示圆点
    [Bootstrap] 6. Navigation
  • 原文地址:https://www.cnblogs.com/lxk2010012997/p/3036092.html
Copyright © 2011-2022 走看看