zoukankan      html  css  js  c++  java
  • 挑战程序设计竞赛 第2章习题 poj 1017 Packets 贪心模拟

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

    题目大意是
    
    有个6*6的面积的集装箱,装上1*1 2*2 3*3 4*4 5*5 6*5的箱子,询问最少需要集装箱的数量 
    
    多行输入 每行 6个数字以空格隔开 表示1~6面积的箱子的数目 6个数字全0 表示输入结束
    
    按照输入的行数 输出多行答案 每行为最少需要集装箱的数量 

    解答 贪心解法 先填入最大的箱子,剩余的空间填入小箱子

    可知 6*6可填充一个集装箱 无缝隙可填充其余箱子

    5*5可填充一个集装箱 剩余缝隙可以填充6*6-5*5 =11个1*1的箱子

    4*4可填充一个集装箱 剩余缝隙可填充5个2*2的箱子 其余可填充1*1的箱子

    3*3比较麻烦  4个3*3可以装满一个集装箱

    1~3个3*3的箱子填充如下 配图 填充1到3个3*3的箱子后 ,可以填充2*2的箱子的个数是5 ,3,1

    按照这种情况模拟的代码

    // 1123555.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    /*
    Sample Input
    99 0 0 0 0 0
    0 99 0 0 0 0
    0 0 99 0 0 0
    0 0 0 99 0 0
    0 0 0 0 99 0
    0 0 0 0 0 99
    99 0 99 0 99 0
    99 99 2 0 99 0
    0 2 0 99 0 0
    0 3 7 99 0 0
    9 3 7 99 0 0
    9 9 9 99 0 0
    9 9 9 0 99 0
    99 99 9 0 99 0
    99 99 9 0 0 0
    0 0 0 0 0 0
    
    Sample Output
    2
    1
    */
    
    int arr[6];
    int ans;
    
    void fill11(int left) {
        int fillcount = min(arr[0], left);
        arr[0] -= fillcount;
        left -= fillcount;
    }
    
    
    void solve()
    {
        ans = 0;
        ans += arr[5]; //6*6
    
        if (arr[4] != 0) {
            int count = arr[4];arr[4] = 0;
            for (int i = 0; i < count; i++) {
                ans++;fill11(6 * 6 - 5 * 5);
            }
        }
    
        if (arr[3] != 0) {
            int count = arr[3];arr[3] = 0;
            for (int i = 0; i < count; i++) {
                ans++; int fill22 = min(arr[1], 5);
                arr[1] -= fill22; 
                fill11(6 * 6 - 4 * 4 - fill22*2*2);
            }
        }
    
        if (arr[2] != 0) {
            int count = arr[2]; arr[2] = 0;
            ans += count / 4; count = count % 4;
            if (count != 0) {
                ans++; int fill22 = min(arr[1], (3- count)*2+1);
                arr[1] -= fill22; fill11(6 * 6 - 3 * 3*count - fill22 * 2 * 2);
            }
        }
    
        if (arr[1] != 0) {
            int count = arr[1]; arr[1] = 0;
            ans += count / 9; count = count % 9;
            if (count != 0) {
                ans++; fill11(6 * 6 - count * 4);
            }
        }
    
        if (arr[0] != 0) {
            ans += arr[0] / 36; arr[0] = arr[0] % 36;
            if(arr[0] != 0){
            ans++; fill11(6 * 6);
            }
        }
        
    }
    
    int main()
    {
        while (1) {
            ans = 0; int isAllZero = 1;
            for (int i = 0; i <= 5; i++) {
                cin >> arr[i]; 
                if (arr[i] != 0) isAllZero = 0;
            }
            if (1 == isAllZero) break;
            solve();
            cout << ans << endl;
        }
        
        return 0;
    }
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    算法 字符串最后一个单词的长度【水】
    算法 按照ASII码从小到大输出字符(数量最多)
    算法 计算一个数转换为二进制后有多少个1
    算法 数字颠倒
    算法 浮点数取整
    算法 进制转换
    C++ 浅析移位运算
    C++ 浅析调试,内存重叠查看
    DB2 close auto commit
    【DB2】Event monitor for locking
  • 原文地址:https://www.cnblogs.com/itdef/p/14578608.html
Copyright © 2011-2022 走看看