uva311 - Packets

来源:互联网 发布:淘宝时尚潘多拉真假 编辑:程序博客网 时间:2024/04/28 10:06

题意:
给你一个一组一定数目大小为1*1,2*2,3*3,4*4,5*5,6*6的小方块,让你装进一个6*6的方块里,求最少需要多少个6*6方块数
思路:
参考了别人的做法。
贪心 ,若有多余则先装2*2的,后装1*1的,因为装了2*2若有多余仍可拆分成1*1
6*6可装 -> 一个6*6
-> 一个5*5+11个1*1
->一个4*4+5个2*2
规格为3的分开讨论(一个6*6方块里装4,3,2,1,个3*3)
将大小为6,5,4,3的都讨论后再最后算2和1
代码如下:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int a[6];int main() {    while (scanf("%d%d%d%d%d%d", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6])) {        if (!a[1] && !a[2] && !a[3] && !a[4] && !a[5] && !a[6])            break;        int cnt = 0;        cnt += a[5];        cnt += a[6];        a[1] -= a[5] * 11;        cnt += a[4];        a[2] -= a[4] * 5;        //3*3的情况:        cnt+=a[3]/4;        //a[3]<4        if (a[3]%4 == 1) {            cnt++;            a[2] -= 5;            a[1] -= 7;        }        else if (a[3]%4 == 2) {            cnt++;            a[2] -= 3;            a[1] -= 6;        }        else if(a[3]%4==3){            cnt++;            a[2] -= 1;            a[1] -= 5;        }        if (a[2] < 0) {            a[1]+=4*a[2];            a[2] =0;        }        if (a[1] < 0)            a[1] = 0;        cnt += (a[1] + 4 * a[2]) / 36;        if ((a[1] + 4 * a[2]) % 36 != 0)            cnt++;        printf("%d\n", cnt);    }}
0 0
原创粉丝点击