#include <cstdio>
//#define DEBUG
#ifdef DEBUG
#define D(x) x
#else
#define D(x)
#endif
using namespace std;
const int MAX = 1000005;
int players[MAX];
int results[MAX];
int main() {
int n, m;
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", players + i);
}
scanf("%d", &m);
for(int i = 1; i <= m; i++) {
char c;
while((c = getchar()) != 'P' && c != 'W') {
}
if(c == 'P') results[i] = -1;
else results[i] = 1;
}
long long min = -1;
for(int i = 1; i <= n; i++) {
long long sum = players[i];
D(printf("Simulating player #%d with sum = %lld.\n", i, sum);)
long long round = i;
int current = i % m;
if(current == 0) current = m;
long long best_round = round;
long long best_sum = sum;
while(true) {
D(printf("- ROUND %lld, sum = %lld + (%d) = %lld.\n", round, sum, results[current], sum + results[current]);)
sum += results[current];
if(sum < best_sum) {
best_sum = sum;
best_round = round;
}
if(sum == 0) {
if(min == -1 || round < min) min = round;
D(printf("-- Lost all money in round %lld.\n", round);)
break;
}
current = (current + n) % m;
if(current == 0) current = m;
if(current == i % m) {
long long diff = sum - players[i];
D(printf("-- Lost %lld in %lld rounds.\n", diff, round);)
if(diff < 0) {
if(players[i] > best_sum) {
long long best_spot = players[i] - best_sum;
D(printf("-- Best gain in previous cycle was %lld.\n", -best_spot);)
if(sum > best_spot) {
long long additional_cycles = sum / (-diff);
if(sum % (-diff) == 0) additional_cycles -= 1;
long long additional_rounds = additional_cycles * round;
sum += additional_cycles * diff;
round += additional_rounds;
D(printf("--- Skipping %lld rounds.\n", additional_rounds);)
}
}
} else {
D(printf("-- CANNOT LOSE.\n");)
break;
}
}
round += n;
}
}
printf("%lld\n", min);
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 | #include <cstdio> //#define DEBUG #ifdef DEBUG #define D(x) x #else #define D(x) #endif using namespace std; const int MAX = 1000005; int players[MAX]; int results[MAX]; int main() { int n, m; scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d", players + i); } scanf("%d", &m); for(int i = 1; i <= m; i++) { char c; while((c = getchar()) != 'P' && c != 'W') { } if(c == 'P') results[i] = -1; else results[i] = 1; } long long min = -1; for(int i = 1; i <= n; i++) { long long sum = players[i]; D(printf("Simulating player #%d with sum = %lld.\n", i, sum);) long long round = i; int current = i % m; if(current == 0) current = m; long long best_round = round; long long best_sum = sum; while(true) { D(printf("- ROUND %lld, sum = %lld + (%d) = %lld.\n", round, sum, results[current], sum + results[current]);) sum += results[current]; if(sum < best_sum) { best_sum = sum; best_round = round; } if(sum == 0) { if(min == -1 || round < min) min = round; D(printf("-- Lost all money in round %lld.\n", round);) break; } current = (current + n) % m; if(current == 0) current = m; if(current == i % m) { long long diff = sum - players[i]; D(printf("-- Lost %lld in %lld rounds.\n", diff, round);) if(diff < 0) { if(players[i] > best_sum) { long long best_spot = players[i] - best_sum; D(printf("-- Best gain in previous cycle was %lld.\n", -best_spot);) if(sum > best_spot) { long long additional_cycles = sum / (-diff); if(sum % (-diff) == 0) additional_cycles -= 1; long long additional_rounds = additional_cycles * round; sum += additional_cycles * diff; round += additional_rounds; D(printf("--- Skipping %lld rounds.\n", additional_rounds);) } } } else { D(printf("-- CANNOT LOSE.\n");) break; } } round += n; } } printf("%lld\n", min); return 0; } |
English