POJ 1017 Packets
July 10, 2018·
CS Theory
·2 min read
Tecker Yu
Tecker Yu
AI Native Cloud Engineer × Part-time Investor

Topic: Greedy Algorithm

Solution Report

#include <cstdio>
#include <algorithm>

int square[7];

// Solution: Always place the largest items first

int solve() {
  int res = 0;
  // 6x6 directly forms one box
  res += square[6];
  // 5x5 forms one box first, then fill with 1x1
  res += square[5];
  square[1] -= 11 * square[5];
  // 4x4 forms one box first, then fill with 2x2, 1x1
  res += square[4];
  int remain = 20 * square[4];
  while(remain != 0) {
    if (square[2] > 0) {
      square[2]--;
      remain-=4;
    } else if (square[1] > 0) {
      square[1]--;
      remain--;
    } else {
      break;
    }
  }

  // 3x3 priority: use 3x3 to form boxes first, then 2x2, 1x1
  res += square[3] / 4;
  square[3] %= 4;
  if (square[3] > 0) {
    res++;
    int a;
    // Trap: 2x2 has quantity restrictions when filling! Handle by cases
    switch(square[3]) {
      case 1:
      a = 5;
      remain = 27;
      break;
      case 2:
      a = 3;
      remain = 18;
      break;
      case 3:
      a = 1;
      remain = 9;
      break;
    }
    while(remain && a && square[2] > 0) {
      remain-=4;
      square[2]--;
      a--;
    }
    square[1]-=remain;
  }

  // If 2x2 still remains, form boxes by themselves, remaining ones continue to combine with 1x1
  if (square[2] > 0) {
    res += square[2] / 9;
    square[2] %=9;
    if (square[2] > 0) {
      res++;
      square[1] -= 36 - 4 * square[2];
    }
  }
  // If 1x1 still remains, can only form boxes by themselves
  if (square[1] > 0) {
    res += square[1] / 36;
    if (square[1] % 36) res++;
  }
  return res;
}

int main() {
  int i;
  while(1) {
    for(i=1;i<=6;i++) {
      scanf("%d", &square[i]);
    }
    if (square[1]+square[2]+square[3]+square[4]+square[5]+square[6] == 0) {
      break;
    }
    printf("%d\n", solve());
  }
  return 0;
}

Views