同題:UVa 00661 – Blowing Fuses
在家庭中我們偶爾會遇到這樣的狀況:在你打開一些家庭電器,如:電燈,電視,洗衣機 …… 之後,當你打開微波爐的一瞬間,跳電了。因為電力使用過多超過保險 絲的最高負載。當然,這是一種安全措施,避免電線過熱燒掉房子。但是,如果在我們打開電器開關之前可以知道打開之後是否會造成保險絲燒掉,那不是很好嗎?
這個程式的任務就是要檢查打開某些電器開關之後,所有使用中的電器其總用電量是否會超過保險絲的容量。
範例測資
範例輸入 | 範例輸出 |
---|---|
EOF 輸入,每筆測試資料的第一行有3個整數 N、M、C,N 代表總共有多少個電器用品 (N <= 20),M 代表共有多少次電器用品開關的動作,C 代表保險絲的容量。 接下來的 N 行各有一個整數 i,分別代表第 1 個電器,第 2 個電器 …… 第 N 個電器用品使用時需要的電流。 再接下來的的 M 行,每行有一個介於 1 到 N 之間的整數 K,代表開/關第 K 個電器用品。注意:對同一個電器用品,第一次動作為開,第二次動作為關,依此類推。假設一開始時所有的電器用品的狀態均為關著的。 N = M = C = 0代表輸入結束。 | 對於每筆測試資料,如果保險絲燒掉,請輸出:「Fuse was blown.」。 如果保險絲沒有燒掉,請輸出:「Fuse was not blown.」並且輸出在開關的過程中出現的最大總用電量。 每組測試資料後請輸出一空白列。請參考Sample output。 |
2 2 10 5 7 1 2 3 6 10 2 5 7 2 1 2 3 1 3 0 0 0 | Sequence 1 Fuse was blown. Sequence 2 Fuse was not blown. Maximal power consumption was 9 amperes. |
解題思路
使用 Map 來紀錄目前的電器用品是開還是關,Map<int, int> 宣告的時候所有的 Value 值都是預設為 0。
每筆測資中間都要換行,但是最後一筆測資之後不能再換行。可以宣告一個 count 變數紀錄目前的 sequence 是多少,改用現在先輸出上一個測資的換行。所以如果 count != 1 的情況下,就先輸出一個換行再輸出 sequence 是多少跟是否有燒壞保險絲。
範例程式碼-ZeroJudge C094: Blowing Fuses
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int N, M, C, count = 1;
while (cin >> N >> M >> C && N != 0 && M != 0 && C != 0)
{
vector<int>num;
num.push_back(-1);
int power = 0, max = -9999;
map<int, int>MAP;
for (int i = 0; i<N; i++)
{
int tmp;
cin >> tmp;
num.push_back(tmp);
}
bool blown = false;
for (int i = 0; i<M; i++)
{
int tmp;
cin >> tmp;
if (MAP[tmp] == 0)
{
MAP[tmp]++;
power += num[tmp];
}
else
{
MAP[tmp]--;
power -= num[tmp];
}
if (power > C) blown = true;
if (power > max) max = power;
}
if (count != 1) cout << "\n";
cout << "Sequence " << count << "\n";
if (blown) cout << "Fuse was blown.\n";
else cout << "Fuse was not blown.\nMaximal power consumption was " << max << " amperes.\n";
count++;
}
}
//ZeroJudge C094
//Dr. SeanXD