poj1484---判断保险丝是否烧断
题目输入要求:
2 2 10 //设备数n 接下来的操作数m 保险丝能承受最大电流c
5 //电器1的电流
7 //2的电流
1 //反转开关1
2 //反转开关2
思路:设置一个flag数组,记得每次进入一个数据集,重新设为0,flag从1开始,flag[1]...flag[n]模拟开关状态
将每个device的电流分别存到ci数组里,从1开始存ci[1],存到ci[n],不管ci[0],n<=20,随便给个 大于21的数
接着,再用一个for循环,读入device序号,如果flag[dev]==0,flag反转为开,ci_total加上对应序号设备的电流ci[dev]
设备序号dev 1 2 3 4 5 6
ci[]设备对应电流 7 4 5 9 2 8
flag[]设备状态 0 0 1 0 1 0
数组序号 0 1 2 3 4 5 6
#include <stdio.h> #include <stdlib.h> #include<string.h> int main() { int n,m,c,i,count=0; int flag[25],ci[1000]; while(scanf("%d%d%d",&n,&m,&c)!=EOF) { int ci_total=0; if(n==0&&m==0&&c==0) break; memset(flag,0,sizeof(flag)); for(i=1;i<n+1;i++) { scanf("%d",&ci[i]); } int max=0; for(i=1;i<m+1;i++) { int dev; scanf("%d",&dev); if(flag[dev]==0) { flag[dev]=1;//反转状态 ci_total+=ci[dev];// } else { flag[dev]=0; ci_total-=ci[dev]; } if(ci_total>max)//如果在过程中,出现了max>c情况接下来的数据输入只可能让他更高,不可能变小,所以,就算比当前大于大于max的数还大,循环出来也是会>c max=ci_total; //没有遇到max>c就没有呗 } if(max>c) { printf("Sequence %d\n",++count); printf("Fuse was blown.\n"); printf("\n"); } else { printf("Sequence %d\n",++count); printf("Fuse was not blown.\n"); printf("Maximal power consumption was %d amperes.\n",max); printf("\n"); } } return 0; }
WA三次,原因memset函数没搞清楚
memset包含于头文件:#include <string.h>,属于字符串处理函数
memset(数组地址,所需要赋的值,所需赋的数组大小,通常是sizeof(数组名)或者sizeof(flag[0]*m))
sizeof(flag[0]*m)表示将数组从给的地址开始的m个元素赋值