#include <iostream> #include <algorithm> #include <string> #include <vector> #include <math.h> using namespace std; int n, m, piniondz[1000000], rozdania[1000000], minima[1000000]; char znak; short int maszyna[1000000]; long long int licznik=0, licznik_koncowy=0; vector <int> spr; vector <int> spr_kon; vector <long long int> licz; int main() { ios_base::sync_with_stdio(0); cin>>n; for(int i=0; i<n; i++){ cin>>piniondz[i]; } cin>>m; for(int i=0; i<m; i++){ cin>>znak; if(znak=='W') maszyna[i]=1; else maszyna[i]=-1; } int i=0, j=0; do{ piniondz[i]=piniondz[i]+maszyna[j]; licznik++; if(piniondz[i]==0){ cout<<licznik; return 0; } rozdania[i]=rozdania[i]+maszyna[j]; if(rozdania[i]<minima[i]) minima[i]=rozdania[i]; i++; j++; if(i==n) i=0; if(j==m) j=0; }while(i!=0 || j!=0); for(int k=0; k<n; k++){ if(rozdania[k]<0 || minima[k]+piniondz[k]<=0){ spr.push_back(k); } } if(spr.empty()==true){ cout<<"-1"; return 0; } licznik_koncowy=licznik; while(true){ for(int k=0; k<spr.size(); k++){ if(piniondz[spr[k]]+minima[spr[k]]<=0){ spr_kon.push_back(spr[k]); } else{ piniondz[spr[k]]=piniondz[spr[k]]+rozdania[spr[k]]; } } if(spr_kon.size()>0) break; licznik_koncowy=licznik_koncowy+licznik; } for(int k=0; k<spr_kon.size(); k++){ i=0; while(piniondz[spr_kon[k]]>0){ int index=(spr_kon[k]+n*i)%m; piniondz[spr_kon[k]]=piniondz[spr_kon[k]]+maszyna[index]; } licz.push_back(licznik_koncowy+(spr_kon[k]+n*i)+1); } long long int mini=licz[0]; for(int k=0; k<licz.size(); k++){ if(licz[k]<mini) mini=licz[k]; } cout<<mini; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | #include <iostream> #include <algorithm> #include <string> #include <vector> #include <math.h> using namespace std; int n, m, piniondz[1000000], rozdania[1000000], minima[1000000]; char znak; short int maszyna[1000000]; long long int licznik=0, licznik_koncowy=0; vector <int> spr; vector <int> spr_kon; vector <long long int> licz; int main() { ios_base::sync_with_stdio(0); cin>>n; for(int i=0; i<n; i++){ cin>>piniondz[i]; } cin>>m; for(int i=0; i<m; i++){ cin>>znak; if(znak=='W') maszyna[i]=1; else maszyna[i]=-1; } int i=0, j=0; do{ piniondz[i]=piniondz[i]+maszyna[j]; licznik++; if(piniondz[i]==0){ cout<<licznik; return 0; } rozdania[i]=rozdania[i]+maszyna[j]; if(rozdania[i]<minima[i]) minima[i]=rozdania[i]; i++; j++; if(i==n) i=0; if(j==m) j=0; }while(i!=0 || j!=0); for(int k=0; k<n; k++){ if(rozdania[k]<0 || minima[k]+piniondz[k]<=0){ spr.push_back(k); } } if(spr.empty()==true){ cout<<"-1"; return 0; } licznik_koncowy=licznik; while(true){ for(int k=0; k<spr.size(); k++){ if(piniondz[spr[k]]+minima[spr[k]]<=0){ spr_kon.push_back(spr[k]); } else{ piniondz[spr[k]]=piniondz[spr[k]]+rozdania[spr[k]]; } } if(spr_kon.size()>0) break; licznik_koncowy=licznik_koncowy+licznik; } for(int k=0; k<spr_kon.size(); k++){ i=0; while(piniondz[spr_kon[k]]>0){ int index=(spr_kon[k]+n*i)%m; piniondz[spr_kon[k]]=piniondz[spr_kon[k]]+maszyna[index]; } licz.push_back(licznik_koncowy+(spr_kon[k]+n*i)+1); } long long int mini=licz[0]; for(int k=0; k<licz.size(); k++){ if(licz[k]<mini) mini=licz[k]; } cout<<mini; return 0; } |