POJ 1017 Packet

http://poj.org/problem?id=1017

有1*1 2*2...6*6的物品 要装在 6*6的parcel中 问最少用多少个parcel

一直没有找到贪心的策略

问题应该出现在 总是在想怎么放入parcel中 使得最节省空间

其实这种角度是很麻烦的 情况太多 很难描述清楚

但是其实 放一类型物品 得到的结果是非常具体的

-->>>即从要放的东西的角度出发

放 一个6*6 物品 会占用一个parce

放 一个5*5 物品 会占用一个parce 并且空出11个1*1的空位

放 一个4*4 物品 会占用一个parce 并且空出5个2*2的空位(可以转化为1*1的空位)

放3*3

:放一个 空出 5个2*2的空位 和7个1*1的空位

:放两个 空出 3个2*2的空位 和6个1*1的空位

:放三个 空出 1个2*2的空位 和5个1*1的空位

1*1 和 2*2 的物品作用是用来填补空位的

如果空位被填满 但是物品还未放完  就要再开一个新的parcel

2*2的物品放完后 将所有2*2的空位 变成 1*1的空位

 1 #include <iostream>
 2 #include <string.h>
 3 #include <stdio.h>
 4
 5 using namespace std;
 6 //从 六种要装的物品考虑 装每一种物品会空出的空格的情况
 7 int num[8];
 8 int main()
 9 {
10     freopen("in.txt", "r", stdin);
11     int temp = 0;
12     int parcel = 0;
13     int space[6];
14     while (~scanf("%d", &num[0]))
15     {
16         temp = 0;
17         temp |= num[0];
18         memset(space, 0, sizeof(space));
19         parcel = 0;
20         for (int i = 1; i < 6; i++)
21         {
22             scanf("%d", &num[i]);
23             temp |= num[i];
24         }
25         if (!temp) break;
26         parcel = num[5] + num[4] + num[3];
27         space[0] = num[4] * 11;//先解决 6*6,5*5,4*4 的包装盒
28         space[1] = num[3] * 5;
29         //解决3*3的盒子
30         int p3 = 0, remain = 0;
31         remain = num[2] % 4;
32         p3 = remain ? (num[2]/4)+1 : num[2]/4;//如果还有剩余就多开一个盒子
33         parcel += p3;
34         switch(remain)//剩下多少个3*3的物品
35         {
36             case 1: space[1] += 5; space[0] += 7;break;
37             case 2: space[1] += 3; space[0] += 6;break;
38             case 3: space[1] += 1; space[0] += 5;break;
39         }
40         //然后解决 2*2 的盒子
41         remain = min(num[1], space[1]);
42         num[1] -= remain;
43         space[1] -= remain;
44         space[0] += space[1] * 4;
45         if (num[1])
46         {
47             remain = num[1] % 9;
48             if (remain)//如果还有剩余就多开一个盒子
49             {
50                 parcel += num[1] / 9 + 1;
51                 space[0] += 4*(9-remain);
52             }
53             else
54             {
55                 parcel += num[1] / 9;
56             }
57         }
58         //解决1*1
59         num[0] -= min(num[0], space[0]);
60         if (num[0])
61         {
62             remain = num[0] % 36;
63             parcel += remain ? num[0] / 36 + 1 : num[0] / 36;//如果还有剩余就多开一个盒子  后面两个逻辑不严密 没有考虑清楚而出错
64         }
65         printf("%d\n", parcel);
66     }
67     return 0;
68 }
时间: 2024-10-06 03:20:04

POJ 1017 Packet的相关文章

poj 1017(贪心)

[题目大意] 题目大意是这样的:某工厂生产几种产品,首先用packet包住,这些产品的高度都是h,底面积有1*1,2*2,3*3,4*4,5*5,6*6六种规格,下面我们要用高度为h,底面积为6*6的集装箱装这些货物,问怎样使所用集装箱数目最少? [解题思路] 我们首先必须先装底面积大的货物,并且对于面积为4*4,5*5,6*6的货物,每一件都需要一个独立的集装箱.对于底面积为3*3的货物,每四个需要一个集装箱. 那么我们可以得知对于装了底面积为3*3的货物的集装箱,其剩余可以装5,3,1个底面

POJ 1017 Packets【贪心】

POJ 1017 题意: 一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为 1*1, 2*2, 3*3, 4*4, 5*5, 6*6.  这些产品通常使用一个  6*6*h的长方体包裹包装然后邮寄给客户.因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量.他们很需要有一个好的程序帮他们解决这个问题从而节省费用.现在这个程序由你来设计.输入数据输入文件包括几行,每一行代表一个订单.每个订单里的一行包括六个整数,中间用空格隔开,分别为 1

poj 1017 Packets 裸贪心

Packets Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43189   Accepted: 14550 Description A factory produces products packed in square packets of the same height h and of the sizes 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. These products are alway

POJ 1017 Packets-装格子 (简单贪心)

http://poj.org/problem?id=1017 1.题意: 一个工厂制造的产品形状都是长方体盒子,它们的高度都是 h,长和宽都相等,一共有六个型号,分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6. 这些产品通常使用一个 6*6*h 的长方体箱子包装然后邮寄给客户.因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的箱子数量BoxNum. 2.解题思路: 由于盒子和箱子的高均为h,因此只需考虑底面积的空间. 6*6的盒子,每个盒子独占一个箱子. 5*5的盒子,每个盒

贪心 —— POJ 1017 Packets

对应POJ题目:点击打开链接 Packets Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 46584   Accepted: 15752 Description A factory produces products packed in square packets of the same height h and of the sizes 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. These pro

POJ 1017 Packets

这题可能是用贪心思想来写的,具体是不是我也不知道,自己对贪心也不是太清楚.之前好像写过,当时似乎没有写出来,不过,这次一下就有了思路.本来是想先装小的包裹,可是试了一下不行,有问题:于是改为先装大的包裹,如果有多余,再装小的,每次都这样,直到所有的包裹被装完为止.试了试,感觉没有什么问题. 代码写的可能有的乱,不过思路还是清楚的. #include<cstdio> #include<iostream> #include<cstring> #include<algo

贪心/poj 1017 Packets

1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 5 int main() 6 { 7 int a1,a2,a3,a4,a5,a6; 8 scanf("%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5,&a6); 9 while ((a1+a2+a3+a4+a5+a6)!=0) 10 { 11 int ans=a6+a5

POJ 1017 Packets(积累)

[题意简述]:这个是别人的博客,有清晰的题意描述,和解题思路,借助他的想法,可以很好的解决这个问题! [分析]:贪心?模拟?见代码 //216K 16Ms #include<iostream> using namespace std; int main() { int ans,a,b,c,d,e,f,Two,One;// 其中Two表示2*2的个数,同理One表示1*1的个数. int u[4] = {0,5,3,1}; while(1) { cin>>a>>b>

poj 1017 贪心

题意:所有货物的高度一样,且其底面积只有六种,分别为1*1 2*2 3*3 4*4 5*5 6*6的,货物的个数依次为p1,p2,p3,p4,p5,p6, 包裹的高度与货物一样,且底面积就为6*6,然后求最少要多少个包裹包含以上所有货物 思路: 由于高度一样,所以忽略高度,只用讨论底面积. 分类讨论: 底面积为6*6的货物,需要1个包裹 底面积为5*5的货物,需要1个包裹,剩余空间用1*1货物填充 底面积为4*4的货物,需要1个包裹,剩余空间用2*2 / 1*1货物填充 底面积为3*3的货物,每