#include <iostream> long long nwd(long long a, long long b) { while (b != 0) { long long t = b; b = a % b; a = t; } return a; } int main(int argc, char *argv[]) { long long n; std::cin >> n; long long *kasa = new long long[n]; for (long long i = 0; i < n; ++i) { std::cin >> kasa[i]; } long long m; std::cin >> m; bool *cykl = new bool[m]; for (long long i = 0; i < m; ++i) { char c; std::cin >> c; if (c == 'W') cykl[i] = true; else cykl[i] = false; } long long ilosc_cykli = nwd(n, m); long long dlugosc_cyklu = m / ilosc_cykli;// po ilu rundach typ zacznie dostawac to samo long long *sumy_cykli = new long long[ilosc_cykli]; for (long long i = 0; i < ilosc_cykli; i++) sumy_cykli[i] = 0; for (long long i = 0; i < ilosc_cykli; ++i) { long long pos = i; for (long long j = 0; j < dlugosc_cyklu; j += 1) { if (cykl[pos]) sumy_cykli[i] += 1; else sumy_cykli[i] -= 1; pos += ilosc_cykli; } } long long *biedaki_kasa = new long long[ilosc_cykli]; long long *biedaki_id = new long long[ilosc_cykli]; for (long long i = 0; i < ilosc_cykli; ++i) { biedaki_kasa[i] = 1024*1024; biedaki_id[i] = -1; } for (long long i = 0; i < n; ++i) { long long cykl = i % ilosc_cykli; if (biedaki_kasa[cykl] > kasa[i]) { biedaki_id[cykl] = i; biedaki_kasa[cykl] = kasa[i]; } } long long *kolejki = new long long[ilosc_cykli]; long long min_gry = -1; for (long long c = 0; c < ilosc_cykli; c++) { if (sumy_cykli[c] >= 0) { long long pos = biedaki_id[c] % m; long long gry = biedaki_id[c]+1; long long hajsy = biedaki_kasa[c]; for (long long i = 0; i < dlugosc_cyklu; i++) { if (cykl[pos]) { hajsy++; } else { hajsy--; if (hajsy == 0) break; } gry += n; pos = (pos + n) % m; } if (hajsy != 0) continue; if (min_gry == -1) { min_gry = gry; } else if (min_gry > gry) { min_gry = gry; } continue; } long long deficyt = -sumy_cykli[c]; long long pelne = biedaki_kasa[c] / deficyt; long long ostatnia_tura = biedaki_kasa[c] % deficyt; if (ostatnia_tura == 0) { ostatnia_tura = deficyt; pelne--; } long long gry = dlugosc_cyklu * pelne * n + biedaki_id[c] + 1 - n; long long pos = biedaki_id[c] % m; while(ostatnia_tura > 0) { gry += n; if (cykl[pos]) { ostatnia_tura ++; } else { ostatnia_tura --; } pos = (pos + n) % m; } if (min_gry == -1) min_gry = gry; else if (gry < min_gry) min_gry = gry; } std::cout << min_gry << std::endl; 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 | #include <iostream> long long nwd(long long a, long long b) { while (b != 0) { long long t = b; b = a % b; a = t; } return a; } int main(int argc, char *argv[]) { long long n; std::cin >> n; long long *kasa = new long long[n]; for (long long i = 0; i < n; ++i) { std::cin >> kasa[i]; } long long m; std::cin >> m; bool *cykl = new bool[m]; for (long long i = 0; i < m; ++i) { char c; std::cin >> c; if (c == 'W') cykl[i] = true; else cykl[i] = false; } long long ilosc_cykli = nwd(n, m); long long dlugosc_cyklu = m / ilosc_cykli;// po ilu rundach typ zacznie dostawac to samo long long *sumy_cykli = new long long[ilosc_cykli]; for (long long i = 0; i < ilosc_cykli; i++) sumy_cykli[i] = 0; for (long long i = 0; i < ilosc_cykli; ++i) { long long pos = i; for (long long j = 0; j < dlugosc_cyklu; j += 1) { if (cykl[pos]) sumy_cykli[i] += 1; else sumy_cykli[i] -= 1; pos += ilosc_cykli; } } long long *biedaki_kasa = new long long[ilosc_cykli]; long long *biedaki_id = new long long[ilosc_cykli]; for (long long i = 0; i < ilosc_cykli; ++i) { biedaki_kasa[i] = 1024*1024; biedaki_id[i] = -1; } for (long long i = 0; i < n; ++i) { long long cykl = i % ilosc_cykli; if (biedaki_kasa[cykl] > kasa[i]) { biedaki_id[cykl] = i; biedaki_kasa[cykl] = kasa[i]; } } long long *kolejki = new long long[ilosc_cykli]; long long min_gry = -1; for (long long c = 0; c < ilosc_cykli; c++) { if (sumy_cykli[c] >= 0) { long long pos = biedaki_id[c] % m; long long gry = biedaki_id[c]+1; long long hajsy = biedaki_kasa[c]; for (long long i = 0; i < dlugosc_cyklu; i++) { if (cykl[pos]) { hajsy++; } else { hajsy--; if (hajsy == 0) break; } gry += n; pos = (pos + n) % m; } if (hajsy != 0) continue; if (min_gry == -1) { min_gry = gry; } else if (min_gry > gry) { min_gry = gry; } continue; } long long deficyt = -sumy_cykli[c]; long long pelne = biedaki_kasa[c] / deficyt; long long ostatnia_tura = biedaki_kasa[c] % deficyt; if (ostatnia_tura == 0) { ostatnia_tura = deficyt; pelne--; } long long gry = dlugosc_cyklu * pelne * n + biedaki_id[c] + 1 - n; long long pos = biedaki_id[c] % m; while(ostatnia_tura > 0) { gry += n; if (cykl[pos]) { ostatnia_tura ++; } else { ostatnia_tura --; } pos = (pos + n) % m; } if (min_gry == -1) min_gry = gry; else if (gry < min_gry) min_gry = gry; } std::cout << min_gry << std::endl; return 0; } |