UVa 661 Blowing Fuses 📅 2026/7/13 13:44:25 题目描述给定若干个电气设备每个设备有一个功耗值安培以及一系列开关操作每次操作切换某个设备的状态若关闭则打开若打开则关闭。已知保险丝的容量为ccc安培。如果任意时刻所有已开启设备的总功耗超过ccc则保险丝会熔断。要求模拟这些操作判断保险丝是否熔断若未熔断则输出整个过程中出现的最大总功耗。输入格式多组测试数据。每组数据第一行为三个整数nnn、mmm、cccn≤20n \le 20n≤20分别表示设备数量、操作次数和保险丝容量。接下来nnn行每行一个正整数cic_ici表示第iii个设备的功耗。随后mmm行每行一个整数xxx1≤x≤n1 \le x \le n1≤x≤n表示对设备xxx进行开关切换。输入以0 0 0结束。输出格式对于每组数据先输出Sequence X:其中XXX为数据组编号从111开始。若保险丝熔断则输出Fuse was blown.否则输出Fuse was not blown.和Maximal power consumption was Y amperes.其中YYY为最大总功耗。每组输出后跟一个空行。样例输入2 2 10 5 7 1 2 3 6 10 2 5 7 2 1 3 0 0 0输出Sequence 1 Fuse was blown. Sequence 2 Fuse was not blown. Maximal power consumption was 9 amperes.题目分析本题只需模拟设备开关状态维护当前总功耗。每次操作后检查总功耗是否超过容量若超过则标记熔断。同时记录操作过程中出现的最大总功耗。由于n≤20n \le 20n≤20操作次数mmm未明确但通常不大模拟复杂度为O(m)O(m)O(m)非常高效。解题思路读入nnn、mmm、ccc。读入每个设备的功耗值存入数组devices[1..n]。初始化设备状态数组used[1..n]全为000关闭当前总功耗current 0最大功耗max_current 0熔断标志blown false。循环mmm次读入操作设备编号x。切换状态used[x] !used[x]。若开启used[x] 1则current devices[x]否则current - devices[x]。若current c则blown true。更新max_current max(max_current, current)。输出结果。注意即使保险丝已熔断仍需继续读入剩余操作因为输入序列已经给出但可在熔断后不再更新最大功耗但代码中仍更新max_current无妨。复杂度分析每组数据时间复杂度O(m)O(m)O(m)空间复杂度O(n)O(n)O(n)。n≤20n \le 20n≤20mmm规模未明确但非常快。代码实现// Blowing Fuses// UVa ID: 661// Verdict: Accepted// Submission Date: 2016-08-23// UVa Run Time: 0.000s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;intmain(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);intcases0,used[25],devices[25],n,m,c;while(cinnmc){if(n0m0c0)break;for(inti1;in;i)cindevices[i];boolblownfalse;intamperes0,max_amperes0;memset(used,0,sizeof(used));intnumber;for(inti1;im;i){cinnumber;used[number]!used[number];if(used[number])amperesdevices[number];elseamperes-devices[number];if(amperesc)blowntrue;max_amperesmax(max_amperes,amperes);}coutSequence cases\n;if(blown)coutFuse was blown.\n;else{coutFuse was not blown.\n;coutMaximal power consumption was max_amperes amperes.\n;}cout\n;}return0;}总结本题通过简单的状态模拟解决了保险丝熔断判断问题。关键在于正确维护当前总功耗和最大功耗并注意熔断后仍需处理后续操作但代码中仍继续模拟。该题适合作为模拟题入门练习。