uva--311+贪心

题意:

货物和箱子是等高的,然后货物的尺寸有1×1,2×2.。。。。6×6六种,箱子的尺寸统一是6*6的。给定6种货物每种的数量,然后求将它们全部装箱所需要的最小箱子数。

思路:

显然要想箱子数最小,就要尽量把每个箱子都装满,那么我们可以每个箱子都选择先装大的,然后再填充小大(因为装了大的可以填充小的,而装了小的确不一定能再装进大的了)。

具体的:每个6*6的货物肯定要一个箱子。

每个5×5的货物可以和11个1×1的货物装一个箱

每个4×4的货物可以和5个2×2的装一个箱

3×3货物的情况比较复杂:

一个箱子可以装4个3×3的或3个3×3+1个2×2+5个1×1或2个3×3+3个2×2+6个1×1

或1个3×3+5个2×2+7个1×1;

然后就是2×2和1×1的货物依次摆放了。

注意上面如果2×2的货物不够的话就用1×1的补,我们可以假定1×1的货物数目是无限的。(有的解题思路也把2×2的看成无限的,到最后如果小于0再用1×1的补)。

具体实现的时候对2×2货物的数目要注意判定,防止他小于0;

代码如下:

<span style="font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    int a[9],i,j,k,cnt;
    while(1)
    {
         int flag=0;
         for(i=1;i<=6;i++)
         {
                scanf("%d",&a[i]);
                if(!a[i])
                    flag++;
         }
         if(flag==6)
               break;
        cnt=a[5]+a[6];
        a[1]-=a[5]*11;
        if(a[4]>0)
        {
              cnt+=a[4];
             if(a[2]>=5*a[4])
                  a[2]-=5*a[4];
             else
             {
                if(a[2]>=0)
                {
                      a[1]-=(20*a[4]-a[2]*4);
                      a[2]=0;
                }
             }
        }
        if(a[3]>0)
        {
               cnt+=a[3]/4;
               a[3]=a[3]%4;
               if(a[3])
               {
                       cnt++;
                      if(a[3]==3)
                             k=1;
                      else if(a[3]==2)
                             k=3;
                      else if(a[3]==1)
                             k=5;
                      if(a[2]>=k)
                      {
                            a[2]-=k;
                            j=36-a[3]*9-k*4;
                           a[1]-=j;
                      }
                      else
                      {
                           if(a[2]>=0)
                           {
                                j=36-a[3]*9-a[2]*4;
                               a[1]-=j; a[2]=0;
                            }
                      }
                }
        }
       if(a[2]>0)
       {
             cnt+=a[2]/9;
             a[2]=a[2]%9;
             if(a[2])
             {
                     cnt++;
                      k=36-a[2]*4;
                      a[1]-=k;
             }
       }
        if(a[1]>0)
       {
               cnt+=a[1]/36;
               if(a[1]%36)
                    cnt++;
        }
        printf("%d\n",cnt);
    }
   return 0;
}</span>
时间: 2024-08-09 06:19:22

uva--311+贪心的相关文章

01_传说中的车(Fabled Rooks UVa 11134 贪心问题)

问题来源:刘汝佳<算法竞赛入门经典--训练指南> P81: 问题描述:你的任务是在n*n(1<=n<=5000)的棋盘上放n辆车,使得任意两辆车不相互攻击,且第i辆车在一个给定的矩形R之内. 问题分析:1.题中最关键的一点是每辆车的x坐标和y坐标可以分开考虑(他们互不影响),不然会变得很复杂,则题目变成两次区间选点问题:使得每辆车在给定的范围内选一个点,任何两辆车不能选同一个点.  2.本题另外一个关键点是贪心法的选择,贪心方法:对所有点的区间,按右端点从小到大排序:每次在一个区间

UVa 11389 (贪心) The Bus Driver Problem

题意: 有司机,下午路线,晚上路线各n个.给每个司机恰好分配一个下午路线和晚上路线. 给出行驶每条路线的时间,如果司机开车时间超过d,则要付加班费d×r. 问如何分配路线才能使加班费最少. 分析: 感觉上是要先排序,然后时间最长的路线配另一个时间最短的路线. 这里就严格证明一下这样贪心的正确性. 以两条路线为例,其他情况都是类似的: 不妨假设:A1≥A2,B1≤B2,水平线代表d 情况一: 如图,司机一要付加班费,司机二不用,如果我们将B1.B2交换: 因为B1≤B2,所以付给司机一的加班费不会

UVa 1467 (贪心+暴力) Installations

题意: 一共有n项服务,每项服务有安装的时间s和截止时间d.对于每项任务,如果有一项超出截止时间,惩罚值为所超出时间的长度.问如何安装才能使惩罚值最大的两个任务的惩罚值之和最小. 分析: 如果是求总惩罚值的最小值,则按所有任务的截止时间排序,这样贪心的理由是,先完成截止时间早的任务至少不会是情况变得更坏. 虽然题目所求不是这个,但我们可以稍作修改. 设p为按上述贪心顺序安装任务,惩罚值最大的两个任务中靠后的那个位置. 枚举p之前的任务i,将第i个任务移到p后面执行,有可能减小两个最大惩罚值之和,

uva 10026 贪心

https://vjudge.net/problem/UVA-10026 对于两个二元组(Ti,Si),(Tj,Sj), 当先执行i时耗费的价值是Ti*Sj,反之则是Tj*Si, 显然如果想要第一种情况更优得话,要满足Ti*Sj<Tj*Si, 按照这个直接排序就好了,因为要求字典序最小所以当二者等价时序号小的优先. 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct node{int t,s,id;}P[1005]; 4 b

UVa 311 - Packets

题目大意: 有1*1,2*2,3*3,4*4,5*5,6*6大小的盒子,要把它们装到6*6的盒子里,它们的高度都是相同的.求用最少的6*6盒子把所有尺寸的盒子都装起来. 分析:(参考 D_Double's Journey的博客) 6*6的盒子中可以由各种尺寸的盒子来填满.可以有以下这些情况: 1个6*6 1个5*5+11个1*1 1个4*4+5个2*2(有空隙时优先放置2*2,如果没放完2*2的,剩下的就放置1*1) 放置3*3时,组合情况比较复杂. 没有放完3*3时,剩下的空隙也是优先尽可能多

·UVa」 11292 - Dragon of Loowater( 贪心 )

Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major problem. The shores of Rellau Creek in central Loowater had always been a prime breeding ground for geese. Due to the lack of predato

优质题表(机密版)

转载请注明出处:http://www.cnblogs.com/dashuzhilin/p/4556803.html 思维题: poj 1528 poj 1597 poj 2538 poj 2608 poj 2612 poj 2361 poj 2339 poj 2664 uva 10894 uva 10921   uva 10922   uva 10929 uva 10931   uva 10800   uva 10878 uva 10976   uva 10323   uva 201 poj 2

Wave

T3 Wave题目描述给定一个长为n的数列,试求一个最长的不稳定波动子序列满足任意偶数项的值不小于其相邻两项的值,且相邻两项的差不小于k. 输入输出格式输入格式:输入第一行两个正整数n,k. 第二行n个非负整数描述这个数列. 输出格式:输出一个整数即为答案. 输入输出样例输入样例#1:10 32 6 7 9 0 3 7 6 4 4输出样例#1:5说明对于20%的数据,n<=10^3 对于70%的数据,n<=10^5 对于100%的数据,n<=2*10^5,数列中的数不超过2^31-1 贪

uva 10382 Watering Grass(贪心)

uva 10382 Watering Grass n sprinklers are installed in a horizontal strip of grass l meters long and w meters wide. Each sprinkler is installed at the horizontal center line of the strip. For each sprinkler we are given its position as the distance f

UVA 11292 Dragon of Loowater(简单贪心)

Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major problem. The shores of Rellau Creek in central Loowater had always been a prime breeding ground for geese. Due to the lack of predato