# Greedy# Brute Force# Combinatorics

c081 - 00102 - Ecological Bin Packing

🔗 前往 ZeroJudge 原題

題目描述

題目描述了三個桶子,每個桶子包含棕色、綠色和透明色玻璃瓶。目標是通過移動玻璃瓶,使每個桶子只包含單一顏色的玻璃瓶,並最小化移動的瓶子數量。如果有多個最小移動方案,則輸出字典順序最小的方案。

解題思路

這道題的解法是枚舉所有可能的桶子顏色分配方案,然後計算每種方案下需要移動的瓶子數量。由於只有三個桶子和三種顏色,所以只有 3! = 6 種可能的分配方案。對於每種方案,計算移動瓶子的數量,並找到最小的移動數量和對應的顏色分配方案。由於題目要求輸出字典順序最小的方案,因此在找到最小移動數量後,如果有多個方案達到這個數量,則選擇字典順序最小的方案。

複雜度分析

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

程式碼

#include <iostream>
using namespace std;
int a[3],b[3],c[3];
int main(){
	while(cin >> a[0]){
		cin >> a[1] >> a[2];
		for(int i=0;i<3;++i)
			cin >> b[i];
		for(int i=0;i<3;++i)
			cin >> c[i];
		int ans,aB=a[1]+a[2],aG=a[0]+a[2],aC=a[0]+a[1],bB=b[1]+b[2],bG=b[0]+b[2],bC=b[0]+b[1],cB=c[1]+c[2],cG=c[0]+c[2],cC=c[0]+c[1];
		ans=min(min(min(aB+bG+cC,aB+bC+cG),min(aG+bB+cC,aG+bC+cB)),min(aC+bG+cB,aC+bB+cG));
		if(ans==aB+bC+cG)
			cout << "BCG ";
		else if(ans==aB+bG+cC)
			cout << "BGC ";
		else if(ans==aC+bB+cG)
			cout << "CBG ";
		else if(ans==aC+bG+cB)
			cout << "CGB ";
		else if(ans==aG+bB+cC)
			cout << "GBC ";
		else if(ans==aG+bC+cB)
			cout << "GCB ";
		cout << ans << "\n";
	}
}

Discussion