# Greedy# Math# Simulation

c110 - 00311 - Packets

🔗 前往 ZeroJudge 原題

題目描述

題目描述了工廠將不同尺寸的正方形產品 (1x1 到 6x6) 打包成 6x6 的箱子運送給客戶,目標是計算最少需要的箱子數量。輸入為六個整數,分別代表各個尺寸產品的數量。當所有產品數量都為 0 時,輸入結束。

解題思路

這題的核心是貪心策略。程式碼按照優先順序嘗試將較大的正方形放入箱子中,以最大化每個箱子的利用率。具體步驟如下:

  1. 首先,盡可能放入 5x5 的正方形。
  2. 然後,盡可能放入 4x4 的正方形。
  3. 接著,盡可能放入 3x3 的正方形。
  4. 然後,盡可能放入 2x2 的正方形,並處理剩餘空間。
  5. 最後,盡可能放入 1x1 的正方形,並處理剩餘空間。

程式碼模擬了這個打包過程,並計算所需的箱子數量。

複雜度分析

  • 時間複雜度: O(1)
  • 空間複雜度: O(1)

程式碼

#include <iostream>
using namespace std;
int a[6];
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	while(cin >> a[0]){
		int ans=0,s=0;
		for(int i=1;i<6;++i){
			cin >> a[i];
			s+=a[i];
		}
		if(s+a[0]==0)break;
		ans+=a[5];
		ans+=a[4];
		a[0]-=a[4]*11;
		ans+=a[3];
		a[1]-=a[3]*5;
		ans+=a[2]/4;
		a[2]%=4;
		if(a[2]){
			ans+=1;
			int re=4-a[2];
			a[1]-=re*2-1;
			a[0]-=(36-a[2]*9-(re*2-1)*4);
		}
		if(a[1]<0){
			a[0]-=a[1]*-2;
			a[1]=0;
		}
		if(a[1]>0){
			ans+=a[1]/9;
			a[1]%=9; 
		}
		if(a[1]>0){
			++ans;
			a[0]-=(36-a[1]*4);
		}
		if(a[0]>0){
			ans+=a[0]/36;
			a[0]%=36;
		}
		if(a[0]>0){
			++ans;
		}
		cout << ans << '\n';
	}
}

Discussion