#include <stdio.h> #include <vector> using namespace std; int gcd(int m, int n) { int tmp; while(m) { tmp = m; m = n % m; n = tmp; } return n; } int lcm(int m, int n) { return m / gcd(m, n) * n; } int oszczednosci[1000000]; bool wygrana[1000000]; vector<int> indexes; vector<int>::iterator it; int main() { int n; //ilosc kolegow int x; char w; scanf("%d", &n); for (int i=0; i<n; ++i) { scanf("%d", &x); oszczednosci[i]=x; } int m; scanf("%d\n", &m); for (int i=0; i<m; ++i) { scanf("%c", &w); wygrana[i]=(w=='W'); ////printf("%c %d ASD\n", w, i); } for (int i=0; i<lcm(n,m); i+=n) { //przekroczona zmienna indexes.push_back(i%m); //printf("%d\n", (i%m)); } int wygrywajacych=0; int moment_przegrania=-2; int moment; int pelnych_cykli; int person_index,index,smallest_in_cycle,sum_in_cycle; for (int i=0; i<n; ++i) { person_index=i%m; sum_in_cycle=0; smallest_in_cycle=0; for (it=indexes.begin(); it<indexes.end(); it++) { index = (person_index+*it)%m; //printf("index %d\n", index); if (wygrana[index]) { sum_in_cycle+=1; } else { sum_in_cycle-=1; } if (sum_in_cycle<smallest_in_cycle) smallest_in_cycle=sum_in_cycle; } if (smallest_in_cycle+oszczednosci[i]>=0 && sum_in_cycle>=0) { //zawsze wygrywa wygrywajacych+=1; continue; } //obliczenie momentu przegrania pelnych_cykli = (oszczednosci[i] + smallest_in_cycle)/(-sum_in_cycle); moment=i+pelnych_cykli*n*indexes.size()-n; //printf("moment %d\n", moment); //printf("oszczednosci[i] %d\n", oszczednosci[i]); //printf("sum_in_cycle %d\n", sum_in_cycle); //printf("indexes.size() %d\n", indexes.size()); oszczednosci[i]+=pelnych_cykli*sum_in_cycle; //printf("oszczednosci[i] %d\n", oszczednosci[i]); for (it=indexes.begin(); it<indexes.end(); it++) { //czy tu powinny byc dwa cykle? index = (person_index+*it)%m; if (wygrana[index]) { oszczednosci[i]+=1; //printf("W\n"); } else { oszczednosci[i]-=1; //printf("P\n"); } moment+=n; //printf("index %d\n", index); //printf("oszczednosci[i] %d\n", oszczednosci[i]); //printf("moment %d\n", moment); if (oszczednosci[i]==0) break; } //printf("X moment %d\n", moment); //printf("X oszczednosci[i] %d\n", oszczednosci[i]); if (moment_przegrania==-2 || moment<moment_przegrania) moment_przegrania=moment; } printf("%d", moment_przegrania+1); 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 | #include <stdio.h> #include <vector> using namespace std; int gcd(int m, int n) { int tmp; while(m) { tmp = m; m = n % m; n = tmp; } return n; } int lcm(int m, int n) { return m / gcd(m, n) * n; } int oszczednosci[1000000]; bool wygrana[1000000]; vector<int> indexes; vector<int>::iterator it; int main() { int n; //ilosc kolegow int x; char w; scanf("%d", &n); for (int i=0; i<n; ++i) { scanf("%d", &x); oszczednosci[i]=x; } int m; scanf("%d\n", &m); for (int i=0; i<m; ++i) { scanf("%c", &w); wygrana[i]=(w=='W'); ////printf("%c %d ASD\n", w, i); } for (int i=0; i<lcm(n,m); i+=n) { //przekroczona zmienna indexes.push_back(i%m); //printf("%d\n", (i%m)); } int wygrywajacych=0; int moment_przegrania=-2; int moment; int pelnych_cykli; int person_index,index,smallest_in_cycle,sum_in_cycle; for (int i=0; i<n; ++i) { person_index=i%m; sum_in_cycle=0; smallest_in_cycle=0; for (it=indexes.begin(); it<indexes.end(); it++) { index = (person_index+*it)%m; //printf("index %d\n", index); if (wygrana[index]) { sum_in_cycle+=1; } else { sum_in_cycle-=1; } if (sum_in_cycle<smallest_in_cycle) smallest_in_cycle=sum_in_cycle; } if (smallest_in_cycle+oszczednosci[i]>=0 && sum_in_cycle>=0) { //zawsze wygrywa wygrywajacych+=1; continue; } //obliczenie momentu przegrania pelnych_cykli = (oszczednosci[i] + smallest_in_cycle)/(-sum_in_cycle); moment=i+pelnych_cykli*n*indexes.size()-n; //printf("moment %d\n", moment); //printf("oszczednosci[i] %d\n", oszczednosci[i]); //printf("sum_in_cycle %d\n", sum_in_cycle); //printf("indexes.size() %d\n", indexes.size()); oszczednosci[i]+=pelnych_cykli*sum_in_cycle; //printf("oszczednosci[i] %d\n", oszczednosci[i]); for (it=indexes.begin(); it<indexes.end(); it++) { //czy tu powinny byc dwa cykle? index = (person_index+*it)%m; if (wygrana[index]) { oszczednosci[i]+=1; //printf("W\n"); } else { oszczednosci[i]-=1; //printf("P\n"); } moment+=n; //printf("index %d\n", index); //printf("oszczednosci[i] %d\n", oszczednosci[i]); //printf("moment %d\n", moment); if (oszczednosci[i]==0) break; } //printf("X moment %d\n", moment); //printf("X oszczednosci[i] %d\n", oszczednosci[i]); if (moment_przegrania==-2 || moment<moment_przegrania) moment_przegrania=moment; } printf("%d", moment_przegrania+1); return 0; } |