#include <iostream> #include <vector> #include <string> #include <cstdio> using namespace std; int main() { long long int friends; scanf("%lld", &friends); long long int money[friends]; for(long long int z=0; z<friends; z++) scanf("%lld", &money[z]); long long int cycle_len; scanf("%lld", &cycle_len); long long int cycle[cycle_len]; getchar(); for(long long int v=0; v<cycle_len; v++) cycle[v] = getchar(); long long int unmodified[friends]; for(long long int z=0; z<friends; z++) unmodified[z] = money[z]; long long int max_decrease[friends], diff[friends]; for(long long int z=0; z<friends; z++) { max_decrease[z] = 0; diff[z] = 0; } if(cycle[0] == 'W') ++diff[0]; else --diff[0]; long long int m_i, c_i, checked = 0, round = 1, ended = 0, no_money = 0; if(friends == 1) m_i = 0; else m_i = 1; if(cycle_len == 1) c_i = 0; else c_i = 1; if(money[0] + diff[0] == 0) ended = 1; long long int a = cycle_len, b = friends, tmp; while(b!=0) { tmp=b; b=a%b; a=tmp; } long long int NWW = (friends/a)*cycle_len; while(!ended) { ++round; if(cycle[c_i] == 'W') ++diff[m_i]; else { --diff[m_i]; if(diff[m_i] + money[m_i] == 0) { no_money = 1; break; } if(diff[m_i] < max_decrease[m_i]) max_decrease[m_i] = diff[m_i]; } m_i = (m_i+1) % friends; c_i = (c_i+1) % cycle_len; if(m_i == 0 && c_i == 0 && checked == 0) { long long int r, max_r = 10000000; checked = 1; ended = 1; for(long long int v=0; v<friends; v++) { money[v] += diff[v]; if(money[v] < unmodified[v]) { ended = 0; if(money[v] + (max_decrease[v] - diff[v]) > 0) r = (money[v] + (max_decrease[v] - diff[v])) / diff[v]; else { max_r = 0; break; } if(r < max_r) { max_r = r; if(max_r <= 0) break; } } } if(max_r > 0) { for(long long int v=0; v<friends; v++) money[v] -= max_r * diff[v]; round += NWW * max_r; } for(long long int v=0; v<friends; v++) diff[v] = 0; } } if(ended && !no_money) printf("1"); else { printf("%lld", round); } 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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include <iostream> #include <vector> #include <string> #include <cstdio> using namespace std; int main() { long long int friends; scanf("%lld", &friends); long long int money[friends]; for(long long int z=0; z<friends; z++) scanf("%lld", &money[z]); long long int cycle_len; scanf("%lld", &cycle_len); long long int cycle[cycle_len]; getchar(); for(long long int v=0; v<cycle_len; v++) cycle[v] = getchar(); long long int unmodified[friends]; for(long long int z=0; z<friends; z++) unmodified[z] = money[z]; long long int max_decrease[friends], diff[friends]; for(long long int z=0; z<friends; z++) { max_decrease[z] = 0; diff[z] = 0; } if(cycle[0] == 'W') ++diff[0]; else --diff[0]; long long int m_i, c_i, checked = 0, round = 1, ended = 0, no_money = 0; if(friends == 1) m_i = 0; else m_i = 1; if(cycle_len == 1) c_i = 0; else c_i = 1; if(money[0] + diff[0] == 0) ended = 1; long long int a = cycle_len, b = friends, tmp; while(b!=0) { tmp=b; b=a%b; a=tmp; } long long int NWW = (friends/a)*cycle_len; while(!ended) { ++round; if(cycle[c_i] == 'W') ++diff[m_i]; else { --diff[m_i]; if(diff[m_i] + money[m_i] == 0) { no_money = 1; break; } if(diff[m_i] < max_decrease[m_i]) max_decrease[m_i] = diff[m_i]; } m_i = (m_i+1) % friends; c_i = (c_i+1) % cycle_len; if(m_i == 0 && c_i == 0 && checked == 0) { long long int r, max_r = 10000000; checked = 1; ended = 1; for(long long int v=0; v<friends; v++) { money[v] += diff[v]; if(money[v] < unmodified[v]) { ended = 0; if(money[v] + (max_decrease[v] - diff[v]) > 0) r = (money[v] + (max_decrease[v] - diff[v])) / diff[v]; else { max_r = 0; break; } if(r < max_r) { max_r = r; if(max_r <= 0) break; } } } if(max_r > 0) { for(long long int v=0; v<friends; v++) money[v] -= max_r * diff[v]; round += NWW * max_r; } for(long long int v=0; v<friends; v++) diff[v] = 0; } } if(ended && !no_money) printf("1"); else { printf("%lld", round); } return 0; } |