# Greedy# Simulation# Conditional Logic

a627 - 7. RAID Sizer

🔗 前往 ZeroJudge 原題

題目描述

題目要求根據給定的陣列容量需求和 RAID 層級,找到最便宜的硬碟陣列配置。可用的硬碟容量和價格分別為 250GB ($75), 400GB ($110), 500GB ($140), 750GB ($250)。RAID 層級包括 RAID 0, RAID 1, 和 RAID 5,它們對硬碟數量和容量有不同的要求。陣列最多可使用 8 個相同容量的硬碟。

解題思路

程式碼採用貪心策略,針對每種 RAID 層級,分別計算使用不同容量硬碟所需的數量,並選擇總成本最低的配置。對於 RAID 0 和 RAID 5,程式碼計算滿足容量需求的最小硬碟數量,然後計算總成本。對於 RAID 1,程式碼將硬碟數量加倍,以滿足鏡射的需求。程式碼遍歷所有可能的硬碟容量,找到成本最低的方案,並輸出結果。

複雜度分析

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

程式碼

#include <iostream>
using namespace std;
int n,is,p[5],v[5],q[5]={250,400,500,750},qv[5]={75,110,140,250};
void pt(){
	int mi=10000000;
	for(int i=0;i<4;++i){
		if(p[i]<=8)mi=min(mi,v[i]=p[i]*qv[i]);
	}
	for(int i=0;i<mi;++i){
		if(v[i]==mi){
			cout << "Qty: " << p[i] << " Disk: " << q[i] << "GB Price: $" << qv[i] << "\n";
			if(is==1)p[i]/=2;
			if(is==5)--p[i];
			cout << "Total price of this " << q[i]*p[i] << "GB array: $" << v[i] << "\n"; 
			break;
		}
	}
}
int main(){
	while(cin >> n >> is){
		if(is==0){
			for(int i=0;i<4;++i){
				p[i]=n/q[i];
				if(n%q[i])++p[i];
			}
			pt();
		}
		else if(is==1){
			for(int i=0;i<4;++i){
				p[i]=n/q[i];
				if(n%q[i])++p[i];
				p[i]*=2;
			}
			pt();
		}
		else{
			
			for(int i=0;i<4;++i){
				p[i]=n/q[i];
				if(n%q[i])++p[i];
				p[i]++;
			}
			pt();
		}
	}
	
}

Discussion