POJ1484 ZOJ1195 UVA661 UVALive5632 Blowing Fuses【模拟】

Blowing Fuses
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 4400 Accepted: 1690

Description

Maybe you are familiar with the following situation. You have plugged in a lot of electrical devices, such as toasters, refrigerators, microwave ovens, computers, stereos, etc, and have them all running. But at the moment when you turn on the TV, the fuse blows, since the power drawn from all the machines is greater than the capacity of the fuse. Of course this is a great safety feature, avoiding that houses burn down too often due to fires ignited by overheating wires. But it is also annoying to walk down to the basement (or some other inconvenient place) to replace to fuse or switch it back on.

What one would like to have is a program that checks before turning on an electrical device whether the combined power drawn by all running devices exceeds the fuses capacity (and it blows), or whether it is safe to turn it on.

Input

The input consists of several test cases. Each test case describes a set of electrical devices and gives a sequence of turn on/off operations for these devices.

The first line of each test case contains three integers n, m and c, where n is the number of devices (n <= 20), m the number of operations performed on these devices and c is the capacity of the fuse (in Amperes). The following n lines contain one positive integer ci each, the consumption (in Amperes) of the i-th device.

This is followed by m lines also containing one integer each, between 1 and n inclusive. They describe a sequence of turn on/turn off operations performed on the devices. For every number, the state of that particular devices is toggled, i.e. if it is currently running, it is turned off, and if it is currently turned off, it will by switched on. At the beginning all devices are turned off.

The input will be terminated by a test case starting with n = m = c = 0. This test case should not be processed.

Output

For each test case, first output the number of the test case. Then output whether the fuse was blown during the operation sequence. The fuse will be blown if the sum of the power consumptions ci of turned on devices at some point exceeds the capacity of the fuse c.

If the fuse is not blown, output the maximal power consumption by turned on devices that occurred during the sequence.

Output a blank line after each test case.

Sample Input

2 2 10
5
7
1
2
3 6 10
2
5
7
2
1
2
3
1
3
0 0 0

Sample Output

Sequence 1
Fuse was blown.

Sequence 2
Fuse was not blown.
Maximal power consumption was 9 amperes.

Source

Southwestern European Regional Contest 1998

问题链接POJ1484 ZOJ1195 UVA661 UVALive5632 Blowing Fuses
问题简述:(略)
问题分析
    n台电器,开关电器m次,保险丝容量c安培。给出n台设备的工作电流,给出m次开关电器的顺序。计算保险丝状态,若为熔断则给出曾通过保险丝的最大电流。
    这个题用模拟法实现,模拟开关操作的过程,统计总工作电流,并且求出最大的电流。
程序说明:(略)
参考链接:(略)
题记:(略)

Regionals 1998 >> Europe - Southwestern

AC的C语言程序如下:

/* POJ1484 ZOJ1195 UVA661 UVALive5632 Blowing Fuses */

#include <stdio.h>
#include <string.h>

#define N 20
int power[N + 1], toggle[N + 1];

int main(void)
{
    int n, m, c, caseno = 0, k, i;
    while(scanf("%d%d%d", &n, &m, &c) != EOF && (n || m || c)) {
        for(i = 1; i <= n; i++)
            scanf("%d", &power[i]);

        memset(toggle, 0, sizeof(toggle));
        int sum = 0, max = 0;
        for(i = 1; i <= m; i++) {       /* 模拟开关操作过程 */
            scanf("%d", &k);
            if(toggle[k])
                sum -= power[k];
            else
                sum += power[k];
            toggle[k] = 1 - toggle[k];
            if(max < sum) max = sum;
        }

        printf("Sequence %d\n", ++caseno);
        if(max > c) printf("Fuse was blown.\n");
        else {
            printf("Fuse was not blown.\n");
            printf("Maximal power consumption was %d amperes.\n", max);
        }
        printf("\n");
    }

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/tigerisland45/p/10339921.html