import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.TreeMap; import java.util.TreeSet; public class haz { public static class Config { } public static class Visit { public Visit(int deep, int gain) { this.deep = deep; this.gain = gain; } int deep; int gain; } public static void main(String[] args) throws IOException{ BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer tokenizer; tokenizer = new StringTokenizer(reader.readLine()); int n = Integer.parseInt(tokenizer.nextToken()); tokenizer = new StringTokenizer(reader.readLine()); long[] zakonczenia = new long[n]; int[] budzet = new int[n]; int[] rund = new int[n]; for(int i = 0; i < n; i++ ) { budzet[i] = Integer.parseInt(tokenizer.nextToken()); zakonczenia[i] = Long.MAX_VALUE; rund[i] = i+1; } tokenizer = new StringTokenizer(reader.readLine()); int m = Integer.parseInt(tokenizer.nextToken()); String lastLine = reader.readLine(); int[] wins = new int[m]; for(int i = 0; i < m; i++) { wins[i] = lastLine.charAt(i) == 'W' ? 1 : -1; } for(int gracz = 0; gracz < n; gracz++) { int graczaStart = (gracz) % m; int wizyta = graczaStart; HashMap<Long, TreeSet<Integer>> niskiWrund = new HashMap<Long, TreeSet<Integer>>(); long najNizszy = 0; long niski = 0; int runda = 0; while(wizyta != graczaStart || niskiWrund.isEmpty()) { niski = niski + wins[wizyta]; najNizszy = Math.min(najNizszy, niski); runda++; if(!niskiWrund.containsKey(niski)) { niskiWrund.put(niski, new TreeSet<Integer>()); } niskiWrund.get(niski).add(runda); wizyta = (wizyta + n) % m; } long ilePelnychRundMoge = -1; if(budzet[gracz] + najNizszy <= 0) { ilePelnychRundMoge = 0; } else if(niski > 0) { // continue; } else { //System.out.println(budzet[gracz] + " + " + najNizszy + ") / 0- " + niski); ilePelnychRundMoge = (budzet[gracz] + najNizszy) / (0-niski); ilePelnychRundMoge += (budzet[gracz] + najNizszy) % (0-niski) > 0 ? 1 : 0; } long ileWOstatniej = budzet[gracz] + niski * ilePelnychRundMoge; //System.out.println("g=" + gracz + " " + runda + " " + najNizszy + " m=" + ilePelnychRundMoge + " " + ileWOstatniej); //System.out.println((ilePelnychRundMoge < 0 ? "nie ma co pisac" : niskiWrund.get(0-ileWOstatniej).first())); //System.out.println(gracz + " p=" + ilePelnychRundMoge); zakonczenia[gracz] = ilePelnychRundMoge < 0 ? Long.MAX_VALUE : gracz+1 + (ilePelnychRundMoge * runda + niskiWrund.get(0-ileWOstatniej).first() - 1) * (n); // zakonczenia[gracz] = budzet[gracz] / niski; //System.out.println(gracz + " " + niski + " runda=" + runda + " z[]" + zakonczenia[gracz]); } long min = Long.MAX_VALUE; for(int i = 0; i < n; i++ ) { min = Math.min(min, zakonczenia[i]); } System.out.println((min < Long.MAX_VALUE ? min : -1)); } }
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 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.TreeMap; import java.util.TreeSet; public class haz { public static class Config { } public static class Visit { public Visit(int deep, int gain) { this.deep = deep; this.gain = gain; } int deep; int gain; } public static void main(String[] args) throws IOException{ BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer tokenizer; tokenizer = new StringTokenizer(reader.readLine()); int n = Integer.parseInt(tokenizer.nextToken()); tokenizer = new StringTokenizer(reader.readLine()); long[] zakonczenia = new long[n]; int[] budzet = new int[n]; int[] rund = new int[n]; for(int i = 0; i < n; i++ ) { budzet[i] = Integer.parseInt(tokenizer.nextToken()); zakonczenia[i] = Long.MAX_VALUE; rund[i] = i+1; } tokenizer = new StringTokenizer(reader.readLine()); int m = Integer.parseInt(tokenizer.nextToken()); String lastLine = reader.readLine(); int[] wins = new int[m]; for(int i = 0; i < m; i++) { wins[i] = lastLine.charAt(i) == 'W' ? 1 : -1; } for(int gracz = 0; gracz < n; gracz++) { int graczaStart = (gracz) % m; int wizyta = graczaStart; HashMap<Long, TreeSet<Integer>> niskiWrund = new HashMap<Long, TreeSet<Integer>>(); long najNizszy = 0; long niski = 0; int runda = 0; while(wizyta != graczaStart || niskiWrund.isEmpty()) { niski = niski + wins[wizyta]; najNizszy = Math.min(najNizszy, niski); runda++; if(!niskiWrund.containsKey(niski)) { niskiWrund.put(niski, new TreeSet<Integer>()); } niskiWrund.get(niski).add(runda); wizyta = (wizyta + n) % m; } long ilePelnychRundMoge = -1; if(budzet[gracz] + najNizszy <= 0) { ilePelnychRundMoge = 0; } else if(niski > 0) { // continue; } else { //System.out.println(budzet[gracz] + " + " + najNizszy + ") / 0- " + niski); ilePelnychRundMoge = (budzet[gracz] + najNizszy) / (0-niski); ilePelnychRundMoge += (budzet[gracz] + najNizszy) % (0-niski) > 0 ? 1 : 0; } long ileWOstatniej = budzet[gracz] + niski * ilePelnychRundMoge; //System.out.println("g=" + gracz + " " + runda + " " + najNizszy + " m=" + ilePelnychRundMoge + " " + ileWOstatniej); //System.out.println((ilePelnychRundMoge < 0 ? "nie ma co pisac" : niskiWrund.get(0-ileWOstatniej).first())); //System.out.println(gracz + " p=" + ilePelnychRundMoge); zakonczenia[gracz] = ilePelnychRundMoge < 0 ? Long.MAX_VALUE : gracz+1 + (ilePelnychRundMoge * runda + niskiWrund.get(0-ileWOstatniej).first() - 1) * (n); // zakonczenia[gracz] = budzet[gracz] / niski; //System.out.println(gracz + " " + niski + " runda=" + runda + " z[]" + zakonczenia[gracz]); } long min = Long.MAX_VALUE; for(int i = 0; i < n; i++ ) { min = Math.min(min, zakonczenia[i]); } System.out.println((min < Long.MAX_VALUE ? min : -1)); } } |