# Greedy# Simulation# Array

c094 - 00661 - Blowing Fuses

🔗 前往 ZeroJudge 原題

題目描述

題目描述了家庭用電情境,需要模擬電器開關的動作,並判斷總用電量是否超過保險絲的容量。輸入包含電器數量、開關次數、保險絲容量,以及每個電器的耗電量和開關序列。輸出判斷保險絲是否燒毀,若未燒毀則輸出最大總用電量。

解題思路

本題採用模擬的方法。首先讀取電器數量 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";
	} 
}

Discussion