#include <cstdio> #include <algorithm> const long long int MAX = 1000001LL; long long int n,m; long long int gracze[MAX+1]; long long int kasa[MAX+1]; long long int lowest[MAX+1]; char wynikgry [MAX+1]; int main(){ scanf("%lld", &n); for(int i = 0; i < n; ++i){ scanf("%lld", &gracze[i]); kasa[i] = gracze[i]; lowest[i] = 0; } scanf("%lld", &m); //for(int i = 0; i <= m; ++i){ scanf("%s", wynikgry); // } //::::Algo:::: long long int nww = (n*m)/(std::__gcd(n,m)); // printf("NWW: %lld\n", nww); long long int gracz, wynik; bool koniec = false; for(int i = 0; i < nww; ++i){ gracz = i % n; wynik = i % m; if(wynikgry[wynik] == 'W'){ kasa[gracz]++; }else{ kasa[gracz]--; } if(kasa[gracz] == 0){ //wynik: printf("%d", i+1); koniec = true; break; }else{ if(lowest[gracz] < gracze[gracz] - kasa[gracz]) lowest[gracz] = gracze[gracz] - kasa[gracz]; } } ////debug: // printf("\n"); // for(int i = 0; i < n; ++i){ // printf("%lld ", kasa[i]); // }printf("\n"); //// if(!koniec){ long long int min, reszta; for(int i = 0; i < n; ++i){ gracz = i; if(gracze[gracz] > kasa[gracz]){ long long int rk = (gracze[gracz]-kasa[gracz]); long long int mnoznik = 1; reszta = 0; while(kasa[gracz] > 0){ if(kasa[gracz]-lowest[gracz]>0){ mnoznik++; kasa[gracz]-= rk; }else{ reszta = kasa[gracz]; kasa[gracz] = 0; } } // if(reszta == 0 && mnoznik >= 1) { // mnoznik--; // reszta+= rk; // } // printf("gracz: %lld, reszta: %lld\n", gracze[gracz],reszta); if(reszta >= 0){ //find(reszta): long long int tmp = nww/n; for(int j = gracz; j < nww; j+=n){ if(wynikgry[j%m] == 'W'){ reszta++; }else{ reszta--; } if(reszta == 0){ reszta = j; break; } } } //end find; gracze[gracz] = nww*mnoznik + reszta + 1; }else{ gracze[gracz] = -1; } } min = 0; for(int i = 0; i < n; ++i){ if(gracze[i]!= -1){ if(gracze[min] == -1) { min = i; } else { if(gracze[min] > gracze[i]) { min = i; } } } } //wynik: printf("%lld", gracze[min]); } //::::EndAlgo:::: // printf("\n"); // for(int i = 0; i < n; ++i){ // printf("%lld ", gracze[i]); // } /// printf("\n"); // for(int i = 0; i < m; ++i){ // printf("%c", wynikgry[i]); // } }
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 | #include <cstdio> #include <algorithm> const long long int MAX = 1000001LL; long long int n,m; long long int gracze[MAX+1]; long long int kasa[MAX+1]; long long int lowest[MAX+1]; char wynikgry [MAX+1]; int main(){ scanf("%lld", &n); for(int i = 0; i < n; ++i){ scanf("%lld", &gracze[i]); kasa[i] = gracze[i]; lowest[i] = 0; } scanf("%lld", &m); //for(int i = 0; i <= m; ++i){ scanf("%s", wynikgry); // } //::::Algo:::: long long int nww = (n*m)/(std::__gcd(n,m)); // printf("NWW: %lld\n", nww); long long int gracz, wynik; bool koniec = false; for(int i = 0; i < nww; ++i){ gracz = i % n; wynik = i % m; if(wynikgry[wynik] == 'W'){ kasa[gracz]++; }else{ kasa[gracz]--; } if(kasa[gracz] == 0){ //wynik: printf("%d", i+1); koniec = true; break; }else{ if(lowest[gracz] < gracze[gracz] - kasa[gracz]) lowest[gracz] = gracze[gracz] - kasa[gracz]; } } ////debug: // printf("\n"); // for(int i = 0; i < n; ++i){ // printf("%lld ", kasa[i]); // }printf("\n"); //// if(!koniec){ long long int min, reszta; for(int i = 0; i < n; ++i){ gracz = i; if(gracze[gracz] > kasa[gracz]){ long long int rk = (gracze[gracz]-kasa[gracz]); long long int mnoznik = 1; reszta = 0; while(kasa[gracz] > 0){ if(kasa[gracz]-lowest[gracz]>0){ mnoznik++; kasa[gracz]-= rk; }else{ reszta = kasa[gracz]; kasa[gracz] = 0; } } // if(reszta == 0 && mnoznik >= 1) { // mnoznik--; // reszta+= rk; // } // printf("gracz: %lld, reszta: %lld\n", gracze[gracz],reszta); if(reszta >= 0){ //find(reszta): long long int tmp = nww/n; for(int j = gracz; j < nww; j+=n){ if(wynikgry[j%m] == 'W'){ reszta++; }else{ reszta--; } if(reszta == 0){ reszta = j; break; } } } //end find; gracze[gracz] = nww*mnoznik + reszta + 1; }else{ gracze[gracz] = -1; } } min = 0; for(int i = 0; i < n; ++i){ if(gracze[i]!= -1){ if(gracze[min] == -1) { min = i; } else { if(gracze[min] > gracze[i]) { min = i; } } } } //wynik: printf("%lld", gracze[min]); } //::::EndAlgo:::: // printf("\n"); // for(int i = 0; i < n; ++i){ // printf("%lld ", gracze[i]); // } /// printf("\n"); // for(int i = 0; i < m; ++i){ // printf("%c", wynikgry[i]); // } } |