#include <iostream>
#define N_MAX 1000000
using namespace std;
int n, m;
int cash[N_MAX], cash_orig[N_MAX], delta;
bool wins[N_MAX], neverEnds = true;
char c[N_MAX];
int bigCycle, cnt, currentIndex = 0, gameNum = 0;
int gcd(int a, int b)
{
int c;
while (b != 0)
{
c = a % b;
a = b;
b = c;
}
return a;
}
int lcm(int a, int b) { return a * b / gcd(a,b); }
void play(int player, int game)
{
cash[player] += (wins[game % m]) ? 1 : -1;
}
int main()
{
ios_base::sync_with_stdio(false);
cin >> n;
for (int i = 0; i < n; ++i)
{
cin >> cash[i];
cash_orig[i] = cash[i];
}
cin >> m;
cin >> c;
for (int i = 0; i < m; ++i)
{
if (c[i] == 'W') wins[i] = true;
}
while (true)
{
// cout << currentIndex << ' ' << cash[currentIndex] << endl;
play(currentIndex, gameNum);
if (cash[currentIndex] == 0)
{
cout << gameNum + 1 << '\n';
return 0;
}
++currentIndex;
currentIndex %= n;
++gameNum;
if (currentIndex == 0 && gameNum % m == 0) break; // big cycle
}
for (int i = 0; i < n; ++i)
{
delta = cash[i] - cash_orig[i];
if (neverEnds && delta < 0) { neverEnds = false; break; }
}
if (neverEnds)
{
cout << "NIE\n";
return 0;
}
while (true)
{
play(currentIndex, gameNum);
if (cash[currentIndex] == 0)
{
cout << gameNum + 1 << '\n';
return 0;
}
++currentIndex;
currentIndex %= n;
++gameNum;
}
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 | #include <iostream> #define N_MAX 1000000 using namespace std; int n, m; int cash[N_MAX], cash_orig[N_MAX], delta; bool wins[N_MAX], neverEnds = true; char c[N_MAX]; int bigCycle, cnt, currentIndex = 0, gameNum = 0; int gcd(int a, int b) { int c; while (b != 0) { c = a % b; a = b; b = c; } return a; } int lcm(int a, int b) { return a * b / gcd(a,b); } void play(int player, int game) { cash[player] += (wins[game % m]) ? 1 : -1; } int main() { ios_base::sync_with_stdio(false); cin >> n; for (int i = 0; i < n; ++i) { cin >> cash[i]; cash_orig[i] = cash[i]; } cin >> m; cin >> c; for (int i = 0; i < m; ++i) { if (c[i] == 'W') wins[i] = true; } while (true) { // cout << currentIndex << ' ' << cash[currentIndex] << endl; play(currentIndex, gameNum); if (cash[currentIndex] == 0) { cout << gameNum + 1 << '\n'; return 0; } ++currentIndex; currentIndex %= n; ++gameNum; if (currentIndex == 0 && gameNum % m == 0) break; // big cycle } for (int i = 0; i < n; ++i) { delta = cash[i] - cash_orig[i]; if (neverEnds && delta < 0) { neverEnds = false; break; } } if (neverEnds) { cout << "NIE\n"; return 0; } while (true) { play(currentIndex, gameNum); if (cash[currentIndex] == 0) { cout << gameNum + 1 << '\n'; return 0; } ++currentIndex; currentIndex %= n; ++gameNum; } return 0; } |
English