1:问题描述
Problem 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 always delivered to customers in the square parcels of the same height h as the products have and of the size 6*6. Because of the expenses it is the interest of the factory as well as of the customer to minimize the number of parcels necessary to deliver the ordered products from the factory to the customer. A good program solving the problem of finding the minimal number of parcels necessary to deliver the given products according to an order would save a lot of money. You are asked to make such a program.
Input
The input file consists of several lines specifying orders. Each line specifies one order. Orders are described by six integers separated by one space representing successively the number of packets of individual size from the smallest size 1*1 to the biggest size 6*6. The end of the input file is indicated by the line containing six zeros.
Output
The output file contains one line for each line in the input file. This line contains the minimal number of parcels into which the order from the corresponding line of the input file can be packed. There is no line in the output file corresponding to the last “null” line of the input file.
Sample Input
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
Sample Output
2 1
2:大致题意
输入6个数据,分别是1*1,2*2,3*3,4*4,5*5,6*6箱子的个数。将这些箱子装在6*6的箱子里面,求出需要最少的箱子数。箱子不能重叠。因为箱子的高度都是h。
3:思路
从最大的开始考虑。
(1)如果是6*6的箱子,那么它必须得占一个箱子而且不能装其他的箱子了。
(2)如果是5*5的箱子,它也必须占一个箱子,不过装上一个5*5之后还可以装11个1*1的箱子。这里要做判断。
(3)如果是4*4的箱子,必须占一个箱子,装上之后还可以装2*2和1*1的箱子。
(4)略。(n个if else 判断就好啦)
4:感想
大致思路就是这样的,一次一次的检索。挺烧脑的一个题。思路必须特别清晰。如果有地方没有考虑周到,一直WA也是很苦逼的。比如说某赫。偷笑~~~
这道题是和某豆豆一起完成的,有机智的ww在(还有一旁不服气的的小豆豆),当然一遍就过啦。
#include <cstdio>
#include<iostream>
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<numeric>
#include<math.h>
#include<string.h>
#include<map>
#include<set>
#include<vector>
using namespace std;
int main()
{
//freopen("r.txt", "r", stdin);
int a[10];
int i,b,num,last;
while(cin>>a[1])
{
int count=0;
for(i=2;i<=6;i++)
cin>>a[i];
for(i=1;i<=6;i++)
if(a[i]==0) count++;
if(count==6) break;
num=a[6];
if(a[5]>0)
{
num+=a[5];
if((a[5]*11)>=a[1])
{
a[1]=0;
}
else
{
a[1]-=a[5]*11;
}
}
if(a[4]>0)
{
num+=a[4];
if(a[4]*5>=a[2])
{
last=36*a[4]-a[4]*16-a[2]*4;
a[2]=0;
if(a[1]>0)
{
if(last>=a[1])
{
a[1]=0;
}
else
{
a[1]-=last;
}
}
}
else
{
a[2]-=a[4]*5;
}
}
if(a[3]>0)
{
num+=a[3]/4;
a[3]%=4;
if(a[3]!=0)
{
num++;
last=36-a[3]*9;
if(a[3]==3)
{
if(a[2]!=0)
{
a[2]--;
if(a[1]>5)
{
a[1]-=5;
}
else
{
a[1]=0;
}
}
else
{
if(a[1]>9)
{
a[1]-=9;
}
else
{
a[1]=0;
}
}
}
if(a[3]==2)
{
if(a[2]>3)
{
a[2]-=3;
if(a[1]>6)
{
a[1]-=6;
}
else
{
a[1]=0;
}
}
else
{
last=18-a[2]*4;
a[2]=0;
if(a[1]>last)
{
a[1]-=last;
}
else
{
a[1]=0;
}
}
}
if(a[3]==1)
{
if(a[2]>5)
{
a[2]-=5;
if(a[1]>7)
{
a[1]-=7;
}
else
{
a[1]=0;
}
}
else
{
last=36-9-a[2]*4;
a[2]=0;
if(a[1]>last)
{
a[1]-=last;
}
else
{
a[1]=0;
}
}
}
}
}
if(a[2]>0)
{
num+=a[2]/9;
a[2]%=9;
if(a[2]!=0)
{
num++;
last=36-a[2]*4;
if(a[1]>last)
{
a[1]-=last;
}
else
{
a[1]=0;
}
}
}
if(a[1]>0)
{
num+=a[1]/36;
a[1]%=36;
if(a[1]!=0)
{
num++;
}
}
cout<<num<<endl;
}
}