首页 > 试题广场 >

包裹运输

[编程题]包裹运输
  • 热度指数:1548 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 16M,其他语言32M
  • 算法知识视频讲解
工厂生产的产品包装在相同高度h,尺寸为1 * 1,2 * 2,3 * 3,4 * 4,5 * 5,6 * 6的方形包装中。 这些产品始终以与产品高度相同的尺寸为6 * 6的包裹交付给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。


输入描述:
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为 1*1 至 6*6 这六种产品的数量。输入文件将以 6 个 0 组成的一行结尾。


输出描述:
除了输入的最后一行 6 个 0 以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。
示例1

输入

0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0

输出

2
1
贪心。首先放6、5、4,每个各需要一个箱子。其中5只能用1填充,4可以用2或1填充。
然后放3。可以用2或1填充。
因为1可以填充任何空闲的地方。所以先算尽可能多用2填充的情况。
最后把1放了。
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            int[] arr = new int[7];
            boolean flag = true;
            for (int i=1; i<=6; i++) {
                arr[i] = sc.nextInt();
                if (arr[i] != 0) { flag = false; }
            }
            if (flag) { return; }
            int ans = 0;
            ans = ans + arr[6] + arr[5] + arr[4] + (arr[3] + 3) / 4;
            int[] two_in_three = {0, 5, 3, 1};
            ans += Math.max(0, ((arr[2] - arr[4] * 5 - two_in_three[arr[3] % 4] + 8) / 9));
            ans += Math.max(0, ((arr[1] - (36 * ans  - 36 * arr[6] - 25 * arr[5] - 16 * arr[4] - 9 * arr[3] - 4 * arr[2] + 35)) / 36));
            System.out.println(ans);
        }
    }

}
编辑于 2019-01-24 21:02:12 回复(7)
写了一百行的,你是认真的吗?这要是面试题目,时间不仅不够,面试官看到一大堆的if-else,估计看的心都没有了。这题得亏是面积的贪心排列,如果是体积的话,难度会更高。
本题思路如下:
1. 对于6*6 的直接统计数目
2. 对于5*5 的统计数目,并从1*1的包裹中选出9个来凑,如果不够,那就直接将1*1的用完了。
对应代码:
num[0] = max(0,num[0]-9*num[-2])

3. 对于 4*4 的,有些复杂。先统计数目,再拿 2*2 的凑,如果出现凑不够的情况,就在从 1*1 里面选。对应代码:
num[0] = max(0,num[0]-4*(5*num[3]-num[1]))
4. 只剩下3*3,2*2和1*1的包裹了,此时不必讨论,直接算余下的包裹总面积,除以 6*6 即可。向上取整就行。
import sys
import math
def solve(num):
    res =sum(num[-3:])
    num[0] = max(0,num[0]-9*num[-2])
    if num[1]<5*num[3]:
        num[0] = max(0,num[0]-4*(5*num[3]-num[1]))
        num[1]=0
    else:
        num[1] -= 5*num[3]
    k = num[0]+4*num[1]+9*num[2]
    res += int(math.ceil(k/36.0))
    return res
if __name__=='__main__':
    for line in sys.stdin.readlines():
        temp = list(map(int,line.split()))
        if temp == [0]*len(temp):
            break
        print(solve(temp))


发表于 2019-09-10 14:23:09 回复(0)
i*i的产品有arr[i]个,进行数学分析:
(1) 由于6*6,5*5,4*4的产品要占一个包裹,一个包裹最多能装4个3*3的产品。因此包裹数可以先初始化为:arr[6] + arr[5] + arr[4] + ceil(arr[3] / 4)
然后我们将2*2和1*1的产品先填入到这些包裹的空隙中
(2) 5*5产品所占的包裹只能再填1*1的产品。如果空间能够装下所有的1*1产品,就暂时无需增加包裹,否则填满这些空间后还会余下1*1的产品,再考虑往4*4产品所在包裹放。
(3) 4*4产品所占的包裹可以再填2*2的产品也可以再填1*1的产品。先将2*2的产品往里放,最多可以放5个,如果所有4*4产品所占包裹的剩余空间能够装下所有2*2的产品,就暂时无需再增加包裹,然后往剩余的空间放1*1的产品(也可能已经没有了)。如果放不下,就继续考虑将余下的2*2和1*1产品往3*3产品所在的包裹放。
(4) 3*3产品所占的包裹可以再填2*2的产品也可以再填1*1的产品(如果一个包裹中只有一个3*3产品,可以放5个2*2产品+7个1*1产品;有连两个3*3产品,可以放3个2*2产品+6个1*1产品;有三个3*3产品,可以放1个2*2产品+5个1*1产品)。先将2*2的产品往里放,无法再放2*2的产品了就再往剩余空间放1*1的产品。
(5) 经历了(1)-(4)如果还剩下1*1和2*2的产品,就需要增加新的包裹,还需要ceil((arr[1]+4*arr[2])/36)个。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while((line = br.readLine()) != null){
            if(line.equals("0 0 0 0 0 0")) break;
            String[] params = line.split(" ");
            int[] size = new int[7];
            for(int i = 0; i < 6; i++) size[i + 1] = Integer.parseInt(params[i]);
            // 尺寸为6*6,5*5和4*4的产品必须要占一个包裹,一个包裹最多能装4个尺寸为3*3的产品
            int count = size[6] + size[5] + size[4] + (size[3] + 3)/4;
            size[3] %= 4;     // 剩下3*3尺寸的产品数
            // 5*5产品占的包裹中只能再塞1*1的产品
            int remain1 = Math.max(0, size[1] - size[5]*11);    // 装完5*5产品所在的包裹后,剩下的1*1产品
            // 4*4产品占的包裹中能再塞1*1和2*2的产品
            int remain2 = 0;        // 装完4*4产品所占包裹后,剩下的2*2产品
            int remainSpace = 0;    // 剩余空间
            if(size[2] > size[4]*5){
                remain2 = size[2] - size[4]*5;     // 放了一个4*4产品之后还能放5个2*2产品
            }else{
                // 装完2*2产品看看4*4产品占的包裹还剩下多少空间
                remainSpace = size[4]*20 - size[2]*4;
                // 有多余的空间就用来放1*1的产品
                remain1 = Math.max(0, remain1 - remainSpace);
            }
            // 3*3产品占的包裹中能再塞1*1和2*2的产品,分为三种情况
            if(size[3] == 1){
                if(remain2 > 5){
                    remain2 -= 5;     // 3*3产品所占包裹最多还能装5个2*2产品
                    remain1 = Math.max(0, remain1 - 7);    // 余下的空间还可以继续装1*1产品
                }else{
                    // 装完2*2产品看看3*3产品占的包裹还剩下多少空间
                    remainSpace += 27 - remain2*4;
                    // 有多余的空间就用来放1*1的产品
                    remain1 = Math.max(0, remain1 - remainSpace);
                    remain2 = 0;
                }
            }
            if(size[3] == 2){
                if(remain2 > 3){
                    remain2 -= 3;
                    remain1 = Math.max(0, remain1 - 6);
                }else{
                    remainSpace += 18 - remain2*4;
                    remain1 = Math.max(0, remain1 - remainSpace);
                    remain2 = 0;
                }
            }
            if(size[3] == 3){
                if(remain2 >= 1){
                    remain2 -= 1;
                    remain1 = Math.max(0, remain1 - 5);
                }else{
                    remainSpace += 9;
                    remain1 = Math.max(0, remain1 - remainSpace);
                    remain2 = 0;
                }
            }
            // 最后如果还剩下1*1和2*2的产品,就开新的包裹
            count += (remain1 + 4*remain2 + 35)/36;
            System.out.println(count);
        }
    }
}

编辑于 2021-07-17 22:50:46 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    int a[6];
    while(true){
        bool flag = true;
        for(int i=0;i<6;i++){
            scanf("%d", &a[i]);
            if(a[i]!=0)
                flag = false;
        }
        if(flag)
            return 0;
        int s = 0;
        for(int i=3;i<6;i++)
            s += a[i];
        a[0] = max(a[0]-9*a[4], 0);
        if(a[1] < 5*a[3]){
            a[0] = max(a[0]-4*(5*a[3]-a[1]), 0);
            a[1] = 0;
        }else
            a[1] -= 5*a[3];
        s += int(ceil((a[0]+4*a[1]+9*a[2])/36.0));
        printf("%d\n", s);
    }
    return 0;
}

发表于 2020-11-19 20:20:29 回复(0)

题目并不难,只要每次装箱的时候越大的包裹越优先考虑就行了。但是这道题很肝,代码特别长。

#include <stdio.h>

int a,b,c,d,e;

int main()
{
	int sum;
	while(scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&sum)!=EOF && a+b+c+d+e+sum)
	{
		if(e)
		{
			sum += e;
			if(a>e*11)
				a -= e * 11;
			else
				a = 0;
		}
		if(d)
		{
			sum += d;
			if(b>e*5)
				b -= e * 5;
			else
			{
				b = 0;
				if(a>((e*5-b)<<2))
					a -= (e * 5 - b) << 2;
				else
					a = 0;
			}
		}
		if(c)
		{
			sum += (c >> 2);
			if(c%4)
			{
				sum++;
				if(c%4==1)
				{
					if(b>=5)
					{
						b -= 5;
						if(a>7)
							a -= 7;
						else
							a = 0;
					}
					else
					{
						if(a>((5-b)<<2)+7)
							a -= ((5 - b) << 2) + 7;
						else
							a = 0;
					}
				}
				else if(c%4==2)
				{
					if(b>=3)
					{
						b -= 3;
						if(a>6)
							a -= 6;
						else
							a = 0;
					}
					else
					{
						if(a>((3-b)<<2)+6)
							a -= ((3 - b) << 2) + 6;
						else
							a = 0;
					}
				}
				else
				{
					if(b)
					{
						b--;
						if(a>5)
							a -= 5;
						else
							a = 0;
					}
					else
					{
						if(a>9)
							a -= 9;
						else
							a = 0;
					}
				}
			}
		}
		if(b)
		{
			sum += b / 9;
			if(b%9)
			{
				sum++;
				if(a>36-((b%9)<<2))
					a -= 36 - ((b % 9) << 2);
				else
					a = 0;
			}
		}
		if(a)
		{
			sum += a / 36;
			if(a%36)
				sum++;
		}
		printf("%d\n",sum);
	}
	return 0;
}


发表于 2019-08-22 10:20:31 回复(0)
//先填大的,再填小的
#include<iostream>
using namespace std;
int main()
{
    int input[7];
    while(cin >> input[1] >> input[2] >> input[3] >> input[4] >> input[5] >> input[6])
    {
        int num = 0;int one_num = 0;int two_num = 0;
        if(!input[1]&&!input[2]&&!input[3]&&!input[4]&&!input[5]&&!input[6]) return 0;
        num = input[6] + input[5] + input[4];//先装size为6/5/4的,一个只能装一箱。会有剩余空间,剩余尽量用2的装
        one_num = 11 * input[5]; 
        two_num = 5 * input[4];  
        num += (input[3] + 3)/4; //装size为3箱子数目
        int tem = input[3] % 4; //最后一个箱子中有几个size大小为3的,根据不同的情况判断填2还是1
        
        if(tem == 1){two_num += 5;one_num += 7;}
        else if(tem == 2){two_num += 3;one_num += 6;}
        else if(tem == 3){two_num += 1;one_num += 5;}
        
        if(two_num > input[2]) one_num += (two_num-input[2])*4;   //剩余空间大于2的数目,剩下的用1填
        else if(two_num < input[2]){                              //剩余空间小于2的数目,最后会剩下一箱里有若干2的
            num += (input[2] - two_num + 8)/9;
            one_num += (9 - (input[2] - two_num)%9)*4;
        }
        
        if(one_num < input[1]) num += (input[1] - one_num)/36;
        cout << num << endl;
    }
}

发表于 2019-05-25 09:29:36 回复(1)
通过率75,总是要多一个
#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> vec(6);
    while(cin>>vec[0])
    {
        int sum=vec[0];
        for(int i=1;i<=5;i++)
        { cin>>vec[i];
          sum+=vec[i];}
        if(sum==0)
            break;
        int ans=0;
        ans+=vec[5];
        ans+=vec[4];
        vec[0]-=vec[4]*11;
        if(vec[0]<0)
            vec[0]=0;
        ans+=vec[3];
        vec[1]-=vec[3]*5;
        if(vec[1]<0)
        {
            vec[0]+=vec[1]*4;
            vec[1]=0;
            if(vec[0]<0)
                vec[0]=0;
        }
        ans+=vec[2]/4;
        int res=vec[2]%4;
        if(res==1)
        {
            vec[1]-=5;
            vec[0]-=7;
            if(vec[1]<0)
            {   vec[0]+=vec[1]*4;
                vec[1]=0;
            }
            if(vec[0]<0)
                vec[0]=0;
        }
        else if(res==2)
        {
            vec[1]-=3;
            vec[0]-=6;
            if(vec[1]<0)
            {    vec[0]+=vec[1]*4;
                 vec[1]=0;
                if(vec[0]<0)
                    vec[0]=0;}
             
        }
        else if(res==3)
        {
            vec[1]-=1;
            vec[0]-=5;
            if(vec[1]<0)
            {
                vec[0]+=vec[1]*4;
                vec[1]=0;
                if(vec[0]<0)
                    vec[0]=0;
            }
        }
        ans+=1;
        ans+=vec[1]/9;
        int res2=vec[1]%9;
        vec[0]-=(9-res2)*4;
        if(vec[0]<0)
            vec[0]=0;
        an***r />         ans+=vec[0]/36;
        if(vec[0]%36!=0)
            an***r />         cout<<ans-1<<endl;
        
    }
    return 0;
}
发表于 2019-05-17 15:41:04 回复(0)
这题其实不难,真的不难
发表于 2019-04-17 20:31:58 回复(0)
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    int arr[7];
    while(cin>>arr[1]>>arr[2]>>arr[3]>>arr[4]>>arr[5]>>arr[6])
    {
        if(((!arr[1]&&!arr[2])&&(!arr[3]&&!arr[4]))&&(!arr[5]&&!arr[6]))
            return 0;//判断输入结束
        int x;
        int can1,can2,would1,would2; //分别存放可以容纳的细碎的小块和实际输出
        can2=5*arr[4]+(4-arr[3]%4);
        if(arr[2]>can2)
        {
            would2=(arr[2]-can2)/9+1;
            can1=11*arr[5]+(4-arr[3]%4)*5+(9-(arr[2]-can2)%9)*4;
        }
        else
        {
            would2=0;
            can1=11*arr[5]+20*arr[4]+(4-arr[3]%4)*9-4*arr[2];
        }
        if(arr[1]>can1)
        {
            would1=(arr[1]-can1)/36+1;
        }
        else
        {
            would1=0;
        }
        x=arr[6]+arr[5]+arr[4]+ceil(double(arr[3])/4)+would2+would1;
        cout<<x<<endl;
    }
}

简直是完全的数学推导,分情况讨论
发表于 2019-04-12 20:21:20 回复(0)
//感觉很笨,就像穷举一样
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<Order> list = new ArrayList<>();
        Order order;
        do {
            order = new Order(scanner);
            list.add(order);
        } while (order.sum != 0);
        list.remove(list.size() - 1);
        execute(list);
    }

    static class Order {
        int[] ints = new int[6];
        int sum;

        Order(Scanner scanner) {
            for (int i = 0; i < 6; i++) {
                ints[i] = scanner.nextInt();
                sum += ints[i];
            }
        }
    }

    static void execute(List<Order> orders) {
        for (Order order : orders) {
            int sum = 0;
            int[] ints = order.ints;
            while (ints[5] > 0) {
                sum++;
                ints[5]--;
            }
            while (ints[4] > 0) {
                sum++;
                ints[4]--;
                ints[0] -= 11;
            }
            while (ints[3] > 0) {
                sum++;
                ints[3]--;
                if (ints[1] >= 5) {
                    ints[1] -= 5;
                } else {
                    int k = 5 - ints[1];
                    ints[1] = 0;
                    ints[0] -= k * 4;
                }
            }
            while (ints[2] > 0) {
                sum++;
                if (ints[2] >= 4) {
                    ints[2] -= 4;
                } else {
                    if (ints[2] == 1) {
                        if (ints[1] >= 5) {
                            ints[1] -= 5;
                            ints[0]-=7;
                        } else {
                            int k = 5 - ints[1];
                            ints[0] -= 7 + k * 4;
                        }

                    }
                    if (ints[2] == 2) {
                        if (ints[1] >= 3) {
                            ints[1] -= 3;
                        } else {
                            int k = 3 - ints[1];
                            ints[0] -= 6 + k * 4;
                        }

                    }
                    if (ints[2] == 3) {
                        if (ints[1] >= 1) {
                            ints[1] -= 1;
                        } else {
                            ints[0] -= 9;
                        }
                    }
                    ints[2] = 0;
                }
            }
            while (ints[1] > 0) {
                sum++;
                if (ints[1] >= 9) {
                    ints[1] -= 9;
                } else {
                    int k = 9 - ints[1];
                    ints[1] = 0;
                    ints[0] -= 4 * k;
                }
            }
            while (ints[0] > 0) {
                sum++;
                if (ints[0] > 36) {
                    ints[0] -= 36;
                } else {
                    ints[0] = 0;
                }
            }
            System.out.println(sum);
        }
    }
}




发表于 2019-04-10 21:16:28 回复(1)
保存每个箱子的剩余容量和可放的最大尺寸
test_lst = []
while True:
    test = list(map(int, input().strip().split()))
    if sum(test) == 0:
        break
    test_lst.append(test)
for test in test_lst:
    pack_num = test[::-1]  # 6 5 4 3 2 1
    largest_pack = 6
    last_num = 36
    pack_lst = []  # [剩余格位,剩余可放最大边长]
    while sum(pack_num) != 0:
        for i in range(len(pack_num)):  # 打包每一个箱子
            while pack_num[i] != 0:  # 当前规格的箱子还有剩余需要打包
                temp_pack_lst = pack_lst[:]
                finish_flag = 0
                for j in range(len(pack_lst)):
                    if pack_lst[j][0] >= (6 - i) * (6 - i) and pack_lst[j][1] >= (6 - i):
                        temp_pack_lst[j][0] -= (6 - i) * (6 - i)
                        temp_pack_lst[j][1] = i
                        finish_flag = 1
                        break
                if finish_flag == 0:
                    temp_pack_lst.append([6 * 6 - (6 - i) * (6 - i), i])
                pack_num[i] -= 1
                pack_lst = temp_pack_lst[:]
    print(len(pack_lst))

发表于 2019-04-04 09:51:26 回复(0)
#从大箱子开始装,已经AC所有样例
while(True):
    
    n1, n2, n3, n4, n5, n6 = map(int, input().split())
    if(n1==0 and n2==0 and n3==0 and n4==0 and n5==0 and n6==0):
        break
        
    ans = 0
    ans += n6
    ans += n5
    ans += n4
    ans += n3 // 4
    
    n1 = n1 - 11 * n5
    
    n1 = n1 - max(0, (n4 * 20 - n2 * 4))
    n2 = n2 - n4 * 5
    
    temp = n3 % 4
    if(temp != 0):
        ans += 1
    if(temp == 1):
        if(n2>0):
            if(n2 <= 5):
                n1 = n1 - (27 - n2 * 4)
            else:
                n1 = n1 - (27 - 5 * 4)
            n2 = n2 - 5
        else:
            n1 = n1 - 27
            
    if(temp == 2):
        if(n2 > 0):
            if(n2 <= 3):
                n1 = n1 - (18 - n2 * 4)
            else:
                n1 = n1 - max(0, 18 - 3 * 4)
            n2 = n2 - 3
        else:
            n1 = n1 - 18
    if(temp == 3):
        if(n2 > 0):
            n1 = n1 - (9 - 1 * 4)
            n2 = n2 - 1
        else:
            n1 = n1 - 9
    
    if(n2 > 0):
        ans += n2 // 9
        if(n2 % 9 != 0):
            ans += 1
            n1 = n1 - (36 - (n2 % 9) * 4)
    if(n1 > 0):
        ans += n1 // 36
        if(n1 % 36 != 0):
            ans += 1
    print(ans)

发表于 2019-03-27 22:12:45 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @author wylu
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = br.readLine()) != null) {
            String[] strs = line.split(" ");
            int[] counts = new int[strs.length];
            boolean flag = true;
            for (int i = 0; i < strs.length; i++) {
                counts[i] = Integer.parseInt(strs[i]);
                if (flag && counts[i] != 0) flag = false;
            }
            if (flag) return;

            // 6 * 6
            int res = counts[5];

            // 5 * 5
            res += counts[4];
            counts[0] -= counts[4] * 11;

            // 4 * 4
            res += counts[3];
            int fillTwo = counts[3] * 5;
            counts[1] -= (fillTwo >= counts[1]) ? counts[1] : fillTwo;
            counts[0] -= (fillTwo >= counts[1]) ? (fillTwo - counts[1]) : 0;

            // 3 * 3
            int rmd = counts[2] % 4;
            res += (counts[2] / 4 + (rmd == 0 ? 0 : 1));
            int[] two = {0, 5, 3, 1}, one = {0, 27, 18, 9};
            if (rmd > 0) {
                counts[1] -= (two[rmd] >= counts[1]) ? counts[1] : two[rmd];
                counts[0] -= (two[rmd] >= counts[1]) ? (one[rmd] - counts[1] * 4) : (8 - rmd);
            }

            // 2 * 2
            res += (counts[1] / 9  + (counts[1] % 9 == 0 ? 0 : 1));
            if (counts[1] % 9 > 0) counts[0] -= (36 - counts[1] % 9 * 4);

            // 1 * 1
            if (counts[1] > 0) res += (counts[0] / 36 + (counts[0] % 36 == 0 ? 0 : 1));
            System.out.println(res);
        }
    }
}

发表于 2019-03-10 20:33:45 回复(0)
优先装规格大的包装,可得到最少的包裹数目。为了方便理解,我把代码写的详细了些。

#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int i, size1, size2, size3, size4, size5, size6, need;
    
    while(cin >> size1 >> size2 >> size3 >> size4 >> size5 >> size6)
    {
        if(size1 == 0 && size2 == 0 && size3 == 0 && 
           size4 == 0 && size5 == 0 && size6 == 0)
        {
            break;
        }
        
        /* 优先装规格大的包装,可得到最少的包裹数目 */
        need = size6; // 6*6的包装不可能和别的拼
        need += size5;
        size1 -= size5 * 11; // 5*5的包装只能和1*1的包装拼
        
        need += size4;
        size2 -= size4 * 10; //4*4的包装优先和2*2的包装拼
        if(size2 < 0) //如果2*2的包装不足够和4*4的拼满,则1*1的和4*4的拼
        {
            size1 += size2;
        }
        
        need += size3 / 4; // 优先把4个3*3的放到一个包裹,如果有多余的3*3,优先和2*2拼,再和1*1拼
        if(size3 % 4 == 1)
        {
            need++;
            size1 -= 3;
            size2 -= 12;
        }
        else if(size3 % 4 == 2)
        {
            need++;
            size2 -= 9;
        }
        else if(size3 % 4 == 3)
        {
            need++;
            size1 -= 3;
            size2 -= 3;
        }
        
         /* 经过前面的操作,3*3,4*4,5*5,6*6的肯定没有剩余,接下来看看2*2和1*1的有没有剩余 */
        if(size2 > 0) // 如果2*2的还有剩余
        {
            need += size2 / 18;
            if(size2 % 18 != 0)
            {
                need++;
                size1 -= (36 - (size2 % 18) * 2); //多出来的2*2还可以和这些个1*1的拼
            }
        }
        
        if(size1 > 0) // 如果1*1的还有剩余
        {
            need += size1 / 36;
            if(size1 % 36 != 0)
            {
                need++;
            }
        }
        cout << need << endl;
    }
    
    return 0;
}

发表于 2019-01-26 23:08:54 回复(1)
#include <stdio.h>
int main() {
    int box[7], cnt, emptyFor1, emptyFor2;
    while (~scanf("%d%d%d%d%d%d", &box[1], &box[2], &box[3],
                  &box[4], &box[5], &box[6])) {
        if (!(box[1] || box[2] || box[3] || box[4] || box[5] || box[6]))
            break;
        cnt = box[6] + box[5] + box[4] + (box[3]+3) / 4;
        emptyFor2 = 5 * box[4];
        emptyFor1 = 11 * box[5];
        switch (box[3] % 4) {
        case 1:
            emptyFor2 += 5;
            emptyFor1 += 7;
            break;
        case 2:
            emptyFor2 += 3;
            emptyFor1 += 6;
            break;
        case 3:
            emptyFor2 += 1;
            emptyFor1 += 5;
            break;
        default:
            break;
        }
        if (emptyFor2 >= box[2]) {
            box[2] = 0;
            emptyFor1 += (emptyFor2-box[2]) * 4;
        } else {
            box[2] -= emptyFor2;
        }
        cnt += (box[2]+8)/9;
        emptyFor1 += 4*(box[2]%9);
        cnt += emptyFor1>=box[1] ? 0 : (box[1]-emptyFor1+35)/36;
        printf("%d\n", cnt);
    }
    return 0;
}

发表于 2018-05-21 22:53:49 回复(1)