c094 - 00661 - Blowing Fuses
題目描述
題目描述了家庭用電情境,需要模擬電器開關的動作,並判斷總用電量是否超過保險絲的容量。輸入包含電器數量、開關次數、保險絲容量,以及每個電器的耗電量和開關序列。輸出判斷保險絲是否燒毀,若未燒毀則輸出最大總用電量。
解題思路
本題採用模擬的方法。首先讀取電器數量 n、開關次數 m 和保險絲容量 c。然後讀取每個電器的耗電量,存儲在數組 n 中。接著,模擬 m 次開關操作。每次操作,根據輸入的電器編號 k,將對應電器的耗電量加到總用電量 now 中。如果 now 大於 c,則保險絲燒毀,輸出 "Fuse was blown."。如果沒有燒毀,則更新最大總用電量 max。最後,輸出保險絲是否燒毀以及最大總用電量。使用負數表示電器關閉,可以避免重複計算。
複雜度分析
- 時間複雜度: O(n + m)
- 空間複雜度: O(n)
程式碼
#include <iostream>
#include <string>
using namespace std;
int main(){
int a=-1,b,c,cs=1;
while(a!=0||b!=0||c!=0){
if(a!=-1){
int max=0,n[a]={0},now=0,k;
bool ans=0;
for(int i=0;i<a;i++)
cin >> n[i];
while(b--){
cin >> k;
now+=n[k-1];
n[k-1]*=-1;
if(now>c)
ans=1;
if(ans!=1&&now>max)
max=now;
}
cout << "Sequence " << cs << "\n";
if(ans==1)
cout << "Fuse was blown.";
else{
cout << "Fuse was not blown.\n";
cout << "Maximal power consumption was " << max << " amperes.";
}
cs++;
}
cin >> a >> b >> c;
if(cs!=1&&(a!=0&&b!=0&&c!=0))cout << "\n\n";
}
}