題目連接:http://poj.org/problem?id=1484node
這題直接簡單模擬便可。給你n個容器,m個操做,最大容量C。模擬每個對器件的開關操做。若是原來是關閉的,則打開,同時最大功耗加上這個器件的功耗。若是原來是打開的,就關了它,同時目前的功耗值減去這個器件所消耗的。這個最大功耗時時更新。若是大於C,輸出Fuse was blown.不然輸出所到達的最大功耗。這個模擬算法很簡單,可是我卻WA了好久(..........)。直到ios
1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 #include<cmath> 5 #include<vector> 6 #include<stack> 7 #include<map> 8 #include<set> 9 #include<list> 10 #include<queue> 11 #include<string> 12 #include<algorithm> 13 #include<iomanip> 14 using namespace std; 15 #define MAX 50 16 17 struct node 18 { 19 int sta; 20 int power; 21 }; 22 23 node arr[MAX] ; 24 25 int n,m ,c; 26 27 int main() 28 { 29 int p = 1; 30 while(cin>>n>>m>>c && n!= 0 && m!= 0 && c != 0) 31 { 32 int t = 0;//功耗警告 33 int sum = 0; 34 int max = 0; 35 int x; 36 for(int i = 0;i <n;i++) 37 { 38 cin>>arr[i].power; 39 arr[i].sta = 0;//初始爲關閉狀態 40 } 41 for(int i = 0; i < m;i++) 42 { 43 cin>>x; 44 if(arr[x-1].sta == 0)//當前爲關閉狀態 45 { 46 arr[x-1].sta = 1;//打開 47 sum += arr[x-1].power; 48 if(sum > max){max = sum;} 49 if(sum > c) 50 { 51 t = 1; 52 //break; //加了這個會一直WA,WA 53 } 54 } 55 else//當前爲打開狀態 56 { 57 arr[x-1].sta = 0; 58 sum -= arr[x-1].power; 59 } 60 } 61 if(t == 1) 62 { 63 cout<<"Sequence "<<p++<<endl<<"Fuse was blown."<<endl; 64 } 65 else 66 { 67 cout<<"Sequence "<<p++<<endl<<"Fuse was not blown."<<endl<<"Maximal power consumption was "<<max<<" amperes."<<endl; 68 } 69 cout<<endl;//注意格式要求,沒有這個換行會 PE 70 } 71 return 0; 72 }
中間判斷功耗大於C時,我將標記置爲1,直接break掉,致使WA了半天,其實刪掉就能夠了(原本就不該該加上去)。由於題目意思把m個操做所有讀入才能進行最終判斷。中途break掉,雖然邏輯沒有什麼錯誤,可是後面的數據實際沒有讀入,程序不容許這樣。算法
最後,題目的輸出格式也要注意下,每一個Sequence間有一行間隔ide