import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberInputStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.StringTokenizer; public class haz { public static void main(String[] args) throws IOException { BufferedReader bi = new BufferedReader(new InputStreamReader(System.in)); PrintWriter drukuj = new PrintWriter(new BufferedOutputStream(System.out)); int liczbaKolegow = Integer.parseInt(bi.readLine()); int [] pieniadze = new int [liczbaKolegow]; int [] pieniadzeTest = new int [liczbaKolegow]; StringTokenizer tokenizer = new StringTokenizer(bi.readLine()); for (int i = 0; i<pieniadze.length; i++){ int ilePieniedzy = Integer.parseInt(tokenizer.nextToken()); pieniadze[i] = ilePieniedzy; pieniadzeTest[i] = ilePieniedzy; } int dlugoscCyklu = Integer.parseInt(bi.readLine()); String cykl = bi.readLine().trim(); int coJakiCzasCyklSiePowtarza = NWW(liczbaKolegow, dlugoscCyklu); int [] efektCyklu = new int [liczbaKolegow]; int iPoPieniadzach = 0; int iPoCyklu = 0; int sumaKrokow = 0; for(int i = 0; i<coJakiCzasCyklSiePowtarza; i++){ sumaKrokow++; if (iPoPieniadzach >= liczbaKolegow) iPoPieniadzach = 0; if (iPoCyklu >= dlugoscCyklu) iPoCyklu = 0; if (cykl.charAt(iPoCyklu) == 'W') pieniadzeTest[iPoPieniadzach]++; else{ pieniadzeTest[iPoPieniadzach]--; if (pieniadze[iPoPieniadzach]<=0){ drukuj.println(sumaKrokow); return; } } iPoCyklu++; iPoPieniadzach++; } for(int i = 0; i<coJakiCzasCyklSiePowtarza; i++){ if (iPoPieniadzach >= liczbaKolegow) iPoPieniadzach = 0; if (iPoCyklu >= dlugoscCyklu) iPoCyklu = 0; if (cykl.charAt(iPoCyklu) == 'W') efektCyklu[iPoPieniadzach]++; else efektCyklu[iPoPieniadzach]--; iPoCyklu++; iPoPieniadzach++; } int poIluCyklach = Integer.MAX_VALUE; for (int i = 0; i<liczbaKolegow; i++){ if (efektCyklu[i]<0){ int mozePoIluCyklach = -1*pieniadze[i]/efektCyklu[i]; poIluCyklach = Math.min(poIluCyklach, mozePoIluCyklach); } } if (poIluCyklach == Integer.MAX_VALUE) drukuj.println("-1"); else{ sumaKrokow = poIluCyklach*coJakiCzasCyklSiePowtarza; boolean czyDokonczyc = true; for (int i = 0; i<liczbaKolegow; i++){ pieniadze[i] = pieniadze[i]+efektCyklu[i]*poIluCyklach; if (pieniadze[i] <= 0){ sumaKrokow = sumaKrokow - (liczbaKolegow - 1 - i); czyDokonczyc = false; break; } } if (czyDokonczyc){ iPoPieniadzach = 0; iPoCyklu = 0; for(int i = 0; i<coJakiCzasCyklSiePowtarza; i++){ sumaKrokow++; if (iPoPieniadzach >= liczbaKolegow) iPoPieniadzach = 0; if (iPoCyklu >= dlugoscCyklu) iPoCyklu = 0; if (cykl.charAt(iPoCyklu) == 'W') pieniadze[iPoPieniadzach]++; else{ pieniadze[iPoPieniadzach]--; if (pieniadze[iPoPieniadzach]<=0){ break; } } iPoCyklu++; iPoPieniadzach++; } } drukuj.println(sumaKrokow); } drukuj.flush(); } static public int NWW(int a, int b) { return (a*b)/NWDR(a, b); } static public int NWDR(int a, int b) { if (b != 0) return NWDR(b, a % b); return a; } }
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 | import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberInputStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.StringTokenizer; public class haz { public static void main(String[] args) throws IOException { BufferedReader bi = new BufferedReader(new InputStreamReader(System.in)); PrintWriter drukuj = new PrintWriter(new BufferedOutputStream(System.out)); int liczbaKolegow = Integer.parseInt(bi.readLine()); int [] pieniadze = new int [liczbaKolegow]; int [] pieniadzeTest = new int [liczbaKolegow]; StringTokenizer tokenizer = new StringTokenizer(bi.readLine()); for (int i = 0; i<pieniadze.length; i++){ int ilePieniedzy = Integer.parseInt(tokenizer.nextToken()); pieniadze[i] = ilePieniedzy; pieniadzeTest[i] = ilePieniedzy; } int dlugoscCyklu = Integer.parseInt(bi.readLine()); String cykl = bi.readLine().trim(); int coJakiCzasCyklSiePowtarza = NWW(liczbaKolegow, dlugoscCyklu); int [] efektCyklu = new int [liczbaKolegow]; int iPoPieniadzach = 0; int iPoCyklu = 0; int sumaKrokow = 0; for(int i = 0; i<coJakiCzasCyklSiePowtarza; i++){ sumaKrokow++; if (iPoPieniadzach >= liczbaKolegow) iPoPieniadzach = 0; if (iPoCyklu >= dlugoscCyklu) iPoCyklu = 0; if (cykl.charAt(iPoCyklu) == 'W') pieniadzeTest[iPoPieniadzach]++; else{ pieniadzeTest[iPoPieniadzach]--; if (pieniadze[iPoPieniadzach]<=0){ drukuj.println(sumaKrokow); return; } } iPoCyklu++; iPoPieniadzach++; } for(int i = 0; i<coJakiCzasCyklSiePowtarza; i++){ if (iPoPieniadzach >= liczbaKolegow) iPoPieniadzach = 0; if (iPoCyklu >= dlugoscCyklu) iPoCyklu = 0; if (cykl.charAt(iPoCyklu) == 'W') efektCyklu[iPoPieniadzach]++; else efektCyklu[iPoPieniadzach]--; iPoCyklu++; iPoPieniadzach++; } int poIluCyklach = Integer.MAX_VALUE; for (int i = 0; i<liczbaKolegow; i++){ if (efektCyklu[i]<0){ int mozePoIluCyklach = -1*pieniadze[i]/efektCyklu[i]; poIluCyklach = Math.min(poIluCyklach, mozePoIluCyklach); } } if (poIluCyklach == Integer.MAX_VALUE) drukuj.println("-1"); else{ sumaKrokow = poIluCyklach*coJakiCzasCyklSiePowtarza; boolean czyDokonczyc = true; for (int i = 0; i<liczbaKolegow; i++){ pieniadze[i] = pieniadze[i]+efektCyklu[i]*poIluCyklach; if (pieniadze[i] <= 0){ sumaKrokow = sumaKrokow - (liczbaKolegow - 1 - i); czyDokonczyc = false; break; } } if (czyDokonczyc){ iPoPieniadzach = 0; iPoCyklu = 0; for(int i = 0; i<coJakiCzasCyklSiePowtarza; i++){ sumaKrokow++; if (iPoPieniadzach >= liczbaKolegow) iPoPieniadzach = 0; if (iPoCyklu >= dlugoscCyklu) iPoCyklu = 0; if (cykl.charAt(iPoCyklu) == 'W') pieniadze[iPoPieniadzach]++; else{ pieniadze[iPoPieniadzach]--; if (pieniadze[iPoPieniadzach]<=0){ break; } } iPoCyklu++; iPoPieniadzach++; } } drukuj.println(sumaKrokow); } drukuj.flush(); } static public int NWW(int a, int b) { return (a*b)/NWDR(a, b); } static public int NWDR(int a, int b) { if (b != 0) return NWDR(b, a % b); return a; } } |