a627 - 7. RAID Sizer
題目描述
題目要求根據給定的陣列容量需求和 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();
}
}
}