import java.io.BufferedInputStream; import java.io.FileNotFoundException; import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet; public class fio { public static void main(String[] args) throws FileNotFoundException { Scanner odczyt = new Scanner(new BufferedInputStream(System.in)); int liczbaFiolek = odczyt.nextInt(); int dlugoscEksperymentu = odczyt.nextInt(); int liczbaParReagujacych = odczyt.nextInt(); int[] iloscSubstancji = new int[liczbaFiolek]; for (int i = 0; i < liczbaFiolek; i++) iloscSubstancji[i] = odczyt.nextInt(); Krok[] krokiEksperymentu = new Krok[dlugoscEksperymentu]; for (int eksperyment = 0; eksperyment < dlugoscEksperymentu; eksperyment++) { int wlewany = odczyt.nextInt(); int naczynie = odczyt.nextInt(); Krok krok = new Krok(wlewany, naczynie); krokiEksperymentu[eksperyment] = krok; } TreeSet<Integer> kolejneWystapienia = new TreeSet<Integer>(); for (int reagent = 0; reagent < liczbaParReagujacych; reagent++) { int reagent1 = odczyt.nextInt(); int reagent2 = odczyt.nextInt(); Krok krokOpcja1 = new Krok(reagent1, reagent2); Krok krokOpcja2 = new Krok(reagent2, reagent1); int wystapienieDla1 = Arrays.binarySearch(krokiEksperymentu, krokOpcja1, new KrokC()); int wystapienieDla2 = Arrays.binarySearch(krokiEksperymentu, krokOpcja2, new KrokC()); int max = Math.max(wystapienieDla1, wystapienieDla2); if (max>=0) { kolejneWystapienia.add(max); } } odczyt.close(); int iloscZmarnowanego = 0; for (int i : kolejneWystapienia){ int reagent1 = krokiEksperymentu[i].from; int reagent2 = krokiEksperymentu[i].to; int min = Math.min(iloscSubstancji[reagent1-1], iloscSubstancji[reagent2-1]); iloscSubstancji[reagent1-1] -= min; iloscSubstancji[reagent2-1] -= min; iloscZmarnowanego += 2*min; } System.out.println(iloscZmarnowanego); } } class KrokC implements Comparator<Krok> { @Override public int compare(Krok p, Krok d) { if (p.from == d.from && p.to == d.to) return 0; if (p.from > d.from) return 1; else return -1; } } class Krok{ int from; int to; Krok(int from, int to){ this.from = from; this.to = to; } }
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 | import java.io.BufferedInputStream; import java.io.FileNotFoundException; import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet; public class fio { public static void main(String[] args) throws FileNotFoundException { Scanner odczyt = new Scanner(new BufferedInputStream(System.in)); int liczbaFiolek = odczyt.nextInt(); int dlugoscEksperymentu = odczyt.nextInt(); int liczbaParReagujacych = odczyt.nextInt(); int[] iloscSubstancji = new int[liczbaFiolek]; for (int i = 0; i < liczbaFiolek; i++) iloscSubstancji[i] = odczyt.nextInt(); Krok[] krokiEksperymentu = new Krok[dlugoscEksperymentu]; for (int eksperyment = 0; eksperyment < dlugoscEksperymentu; eksperyment++) { int wlewany = odczyt.nextInt(); int naczynie = odczyt.nextInt(); Krok krok = new Krok(wlewany, naczynie); krokiEksperymentu[eksperyment] = krok; } TreeSet<Integer> kolejneWystapienia = new TreeSet<Integer>(); for (int reagent = 0; reagent < liczbaParReagujacych; reagent++) { int reagent1 = odczyt.nextInt(); int reagent2 = odczyt.nextInt(); Krok krokOpcja1 = new Krok(reagent1, reagent2); Krok krokOpcja2 = new Krok(reagent2, reagent1); int wystapienieDla1 = Arrays.binarySearch(krokiEksperymentu, krokOpcja1, new KrokC()); int wystapienieDla2 = Arrays.binarySearch(krokiEksperymentu, krokOpcja2, new KrokC()); int max = Math.max(wystapienieDla1, wystapienieDla2); if (max>=0) { kolejneWystapienia.add(max); } } odczyt.close(); int iloscZmarnowanego = 0; for (int i : kolejneWystapienia){ int reagent1 = krokiEksperymentu[i].from; int reagent2 = krokiEksperymentu[i].to; int min = Math.min(iloscSubstancji[reagent1-1], iloscSubstancji[reagent2-1]); iloscSubstancji[reagent1-1] -= min; iloscSubstancji[reagent2-1] -= min; iloscZmarnowanego += 2*min; } System.out.println(iloscZmarnowanego); } } class KrokC implements Comparator<Krok> { @Override public int compare(Krok p, Krok d) { if (p.from == d.from && p.to == d.to) return 0; if (p.from > d.from) return 1; else return -1; } } class Krok{ int from; int to; Krok(int from, int to){ this.from = from; this.to = to; } } |