#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; } |
English