fork(1) download
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. class Makanan {
  5. private int harga;
  6. private String tipe;
  7.  
  8. public Makanan(int harga, String tipe){
  9. this.harga=harga;
  10. this.tipe=tipe;
  11. }
  12.  
  13. String getTipe(){
  14. return this.tipe;
  15. }
  16.  
  17. int getHarga(){
  18. return this.harga;
  19. }
  20. }
  21.  
  22. class Pelanggan {
  23. private int id;
  24. private String statusKesehatan;
  25. private int uang;
  26. private Queue<Makanan> makananDiPesan;
  27. private Queue<Koki> dilayaniKoki;
  28. private int tagihan;
  29. private boolean saatPenuh;
  30.  
  31. public Pelanggan(int id, int uang, String statusKesehatan){
  32. this.id=id;
  33. this.statusKesehatan=statusKesehatan;
  34. this.uang=uang;
  35. makananDiPesan = new LinkedList<Makanan>();
  36. dilayaniKoki = new LinkedList<Koki>();
  37. tagihan=0;
  38. }
  39.  
  40. void saatPenuh(){
  41. this.saatPenuh=true;
  42. }
  43.  
  44. boolean getKondisiMasuk(){
  45. return this.saatPenuh;
  46. }
  47.  
  48. void saatSepi(){
  49. this.saatPenuh=false;
  50. }
  51.  
  52. int getId(){
  53. return this.id;
  54. }
  55.  
  56. String getStatus(){
  57. return this.statusKesehatan;
  58. }
  59.  
  60. void tambahPesanan (Makanan makanan){
  61. makananDiPesan.add(makanan);
  62. tagihan+=makanan.getHarga();
  63. }
  64.  
  65. int getTagihan(){
  66. return this.tagihan;
  67. }
  68.  
  69. void resetTagihan(){
  70. this.tagihan=0;
  71. }
  72.  
  73. Makanan getMakanan() {
  74. return this.makananDiPesan.poll();
  75. }
  76.  
  77. int getUang(){
  78. return this.uang;
  79. }
  80.  
  81. Koki getKoki() {
  82. this.makananDiPesan.poll();
  83. return this.dilayaniKoki.poll();
  84. }
  85.  
  86. void tambahKoki (Koki koki){
  87. this.dilayaniKoki.add(koki);
  88. }
  89. }
  90.  
  91. class Koki {
  92. private int id;
  93. private String spesialisasi;
  94. private int banyakMelayani=0;
  95.  
  96. public Koki(int id, String spesialisasi){
  97. this.id=id;
  98. this.spesialisasi=spesialisasi;
  99. }
  100.  
  101. int getId(){
  102. return this.id;
  103. }
  104.  
  105. String getSpesialisasi(){
  106. return this.spesialisasi;
  107. }
  108.  
  109. int getBanyakMelayani(){
  110. return this.banyakMelayani;
  111. }
  112.  
  113. void tambahPelayanan(){
  114. this.banyakMelayani++;
  115. }
  116.  
  117. }
  118.  
  119. class lowestComparator implements Comparator<Koki>{
  120. @Override
  121. public int compare(Koki a, Koki b){
  122. // cek pada banyak melayani
  123. if (a.getBanyakMelayani() < b.getBanyakMelayani()) return -1;
  124. else if (a.getBanyakMelayani() == b.getBanyakMelayani()){
  125. // cek pada spesialisasi (sort secara descending)
  126. if (a.getSpesialisasi().compareTo(b.getSpesialisasi())>0){
  127. return -1;
  128. } else if (a.getSpesialisasi().compareTo(b.getSpesialisasi()) == 0){
  129. // cek pada id
  130. if (a.getId() < b.getId()) return -1;
  131. }
  132. }
  133. return 1;
  134. }
  135. }
  136.  
  137. class TP1 {
  138. private static InputReader in;
  139. // private static Scanner in;
  140. private static PrintWriter out;
  141. private static ArrayList<Makanan> daftarMakanan; // index arraylist == id/index makanan-1
  142. private static ArrayList<Koki> daftarKoki;
  143. private static ArrayList<Pelanggan> daftarPelanggan; // berlaku selamanya
  144. private static ArrayList<Integer> daftarBlacklist; // isinya id pelanggan dan berlaku selamanya
  145. private static ArrayList<Pelanggan> pelangganDatang; // berlaku pada hari itu
  146. private static ArrayList<Pelanggan> ruangRestoran; // berlaku pada hari itu
  147. private static Queue<Pelanggan> urutanPelanggan; // berlaku pada hari itu
  148. private static HashMap<String, Integer> costs;
  149. private static HashMap<String, Boolean> foundPackage;
  150.  
  151. public static void main(String[] args) {
  152. InputStream inputStream = System.in;
  153. in = new InputReader(inputStream);
  154. OutputStream outputStream = System.out;
  155. out = new PrintWriter(outputStream);
  156.  
  157. // Input keperluan makanan lalu buat objek Makanan dan tambahkan ke daftarMakanan
  158. int banyakMakanan = in.nextInt();
  159. daftarMakanan = new ArrayList<Makanan>();
  160. for (int i=0;i<banyakMakanan;i++) {
  161. int harga = in.nextInt();
  162. String tipe = in.next();
  163. Makanan makanan = new Makanan(harga, tipe);
  164. daftarMakanan.add(makanan);
  165. }
  166.  
  167. // Input keperluan koki lalu buat objek Koki dan tambahkan ke daftarKoki
  168. int banyakKoki = in.nextInt();
  169. daftarKoki = new ArrayList<Koki>();
  170. for (int i=0;i<banyakKoki;i++) {
  171. String spesialisasi = in.next();
  172. Koki koki = new Koki(i+1, spesialisasi);
  173. daftarKoki.add(koki);
  174. }
  175.  
  176. int banyakPelanggan = in.nextInt();
  177. daftarBlacklist = new ArrayList<Integer>();
  178. daftarPelanggan = new ArrayList<Pelanggan>();
  179. int banyakKursi = in.nextInt();
  180. int jumlahHari = in.nextInt();
  181.  
  182. for (int hariKe=1;hariKe<=jumlahHari;hariKe++){
  183. int jumlahPelanggan = in.nextInt();
  184. ruangRestoran = new ArrayList<Pelanggan>();
  185. urutanPelanggan = new LinkedList<Pelanggan>();
  186. pelangganDatang = new ArrayList<Pelanggan>();
  187. for (int pelangganKe=0;pelangganKe<jumlahPelanggan;pelangganKe++) {
  188. // Input keperluan Pelanggan
  189. int id = in.nextInt();
  190. String status = in.next();
  191. int uang = in.nextInt();
  192. int range;
  193.  
  194. // Lakukan advance scanning
  195. if (status.equals("?")){
  196. range = in.nextInt();
  197. int neg = 0;
  198. int pos = 0;
  199. for (int i = pelangganKe-range; i<=pelangganKe-1;i++){ // hitung pelanggan positif dan negatif
  200. if (pelangganDatang.get(i).getStatus().equals("+")) pos++;
  201. else neg++;
  202. }
  203. if (neg<pos) status="+";
  204. else status="-";
  205. }
  206.  
  207. // Buat Objek Pelanggan lalu tambahkan ke daftarPelanggan
  208. Pelanggan pelanggan = new Pelanggan(id, uang, status);
  209. pelangganDatang.add(pelanggan);
  210. if (cariPelanggan(id) != null) daftarPelanggan.remove(cariPelanggan(id));
  211. daftarPelanggan.add(pelanggan);
  212.  
  213.  
  214. if (status.equals("-") && !daftarBlacklist.contains(id)){ // Diperbolehkan masuk dan Apabila pelanggan tidak ada di daftar blacklist
  215. ruangRestoran.add(pelanggan);
  216. if (ruangRestoran.size() <= banyakKursi) { // Cek slot
  217. pelanggan.saatSepi();
  218. } else {
  219. pelanggan.saatPenuh();
  220. }
  221. }
  222. }
  223.  
  224. for (int i=0;i<jumlahPelanggan;i++){
  225. Pelanggan pelanggan = pelangganDatang.get(i);
  226. if (daftarBlacklist.contains(pelanggan.getId())) out.print("3");
  227. else if (pelanggan.getStatus().equals("+")) out.print("0");
  228. else if (pelanggan.getStatus().equals("-") && !pelanggan.getKondisiMasuk()) out.print("1");
  229. else out.print("2");
  230. if (i!=jumlahPelanggan-1) out.print(" ");
  231. }
  232. out.println();
  233.  
  234. int jumlahPelayanan = in.nextInt();
  235. for (int layananKe=0;layananKe<jumlahPelayanan;layananKe++){
  236. String perintah = in.next();
  237. if (perintah.equals("P")){
  238. int idPelanggan = in.nextInt();
  239. int indexMakanan = in.nextInt();
  240. Koki koki=null;
  241.  
  242. // Cari koki dengan spesialisasi yang dicari dan yang paling sedikit melayani dan yang idnya paling kecil
  243. for (int i=0;i<daftarKoki.size();i++){
  244. if (daftarKoki.get(i).getSpesialisasi().equals(daftarMakanan.get(indexMakanan-1).getTipe())){
  245. if (koki==null){
  246. koki=daftarKoki.get(i);
  247. } else if (koki.getBanyakMelayani() > daftarKoki.get(i).getBanyakMelayani()){
  248. koki=daftarKoki.get(i);
  249. } else if (koki.getBanyakMelayani() == daftarKoki.get(i).getBanyakMelayani()){
  250. if (koki.getId() > daftarKoki.get(i).getId()){
  251. koki=daftarKoki.get(i);
  252. }
  253. }
  254. }
  255. }
  256.  
  257. Pelanggan pelanggan = cariPelanggan(idPelanggan);
  258. pelanggan.tambahPesanan(daftarMakanan.get(indexMakanan-1));
  259. pelanggan.tambahKoki(koki);
  260.  
  261. urutanPelanggan.add(pelanggan);
  262. out.println(koki.getId());
  263. // return id koki yg mengambil pesanan
  264.  
  265. } else if (perintah.equals("L")){
  266. Pelanggan pelanggan = urutanPelanggan.poll();
  267. Koki koki = pelanggan.getKoki();
  268. koki.tambahPelayanan();
  269. out.println(pelanggan.getId());
  270. // return id pelanggan yg memesan
  271.  
  272. } else if (perintah.equals("B")){
  273. int idPelanggan = in.nextInt();
  274. Pelanggan pelanggan = cariPelanggan(idPelanggan);
  275.  
  276. if (pelanggan.getUang() < pelanggan.getTagihan()){
  277. out.println("pelanggan dengan id " + idPelanggan + " masuk list blacklist");
  278. daftarBlacklist.add(pelanggan.getId());
  279. out.println(0);
  280. } else{
  281. out.println(1);
  282. }
  283. pelanggan.resetTagihan();
  284. ruangRestoran.remove(pelanggan);
  285. // return mencukupi/tidak
  286.  
  287. } else if (perintah.equals("C")){
  288. int q = in.nextInt();
  289. ArrayList<Koki> copyOfDaftarKoki = new ArrayList<Koki>();
  290. copyOfDaftarKoki.addAll(daftarKoki);
  291. Collections.sort(copyOfDaftarKoki, new lowestComparator());
  292. for (int i=0;i<q;i++) {
  293. if (i<q-1) out.print(copyOfDaftarKoki.get(i).getId() + " ");
  294. else out.println(copyOfDaftarKoki.get(i).getId());
  295. }
  296.  
  297. // return id koki berada pada urutan ke q teratas
  298. } else if (perintah.equals("D")){
  299. int costA = in.nextInt();
  300. int costG = in.nextInt();
  301. int costS = in.nextInt();
  302. costs = new HashMap<String, Integer>();
  303. costs.put("A", costA);
  304. costs.put("G", costG);
  305. costs.put("S", costS);
  306.  
  307. foundPackage = new HashMap<String , Boolean>();
  308. foundPackage.put("A", false);
  309. foundPackage.put("G", false);
  310. foundPackage.put("S", false);
  311.  
  312. out.println(paketTermurah(0));
  313. // harga minimum utk dpt membeli seluruh daftarMakanan makanan
  314. }
  315. }
  316. }
  317.  
  318.  
  319. out.close();
  320. }
  321.  
  322. public static int paketTermurah(int start){
  323. if (start==daftarMakanan.size()) return 0;
  324.  
  325. int ans = Integer.MAX_VALUE;
  326. for (int i=start; i<daftarMakanan.size(); i++){
  327. int temp=0;
  328. if (daftarMakanan.get(start).getTipe().equals(daftarMakanan.get(i).getTipe())){
  329. if (i==start) {
  330. temp = daftarMakanan.get(start).getHarga() + paketTermurah(i+1);
  331. } else if (daftarMakanan.get(start).getTipe().equals("A")) {
  332. if (foundPackage.get("A")) {
  333. continue;
  334. } else {
  335. foundPackage.replace("A", true);
  336. temp = costs.get("A")*(i-start+1) + paketTermurah(i+1);
  337. foundPackage.replace("A",false);
  338. }
  339. } else if (daftarMakanan.get(start).getTipe().equals("G")) {
  340. if (foundPackage.get("G")) continue;
  341. else {
  342. foundPackage.replace("G", true);
  343. temp = costs.get("G")*(i-start+1) + paketTermurah(i+1);
  344. foundPackage.replace("G",false);
  345. }
  346. } else {
  347. if (foundPackage.get("S")) continue;
  348. else {
  349. foundPackage.replace("S", true);
  350. temp = costs.get("S")*(i-start+1) + paketTermurah(i+1);
  351. foundPackage.replace("S",false);
  352. }
  353. }
  354. ans = Math.min(temp, ans);
  355. }
  356. }
  357.  
  358.  
  359.  
  360. return ans;
  361. }
  362.  
  363. // taken from https://c...content-available-to-author-only...s.com/submissions/Petr
  364. // together with PrintWriter, these input-output (IO) is much faster than the
  365. // usual Scanner(System.in) and System.out
  366. // please use these classes to avoid your fast algorithm gets Time Limit
  367. // Exceeded caused by slow input-output (IO)
  368. static class InputReader {
  369. public BufferedReader reader;
  370. public StringTokenizer tokenizer;
  371.  
  372. public InputReader(InputStream stream) {
  373. reader = new BufferedReader(new InputStreamReader(stream));
  374. }
  375.  
  376. public String next() {
  377. while (tokenizer == null || !tokenizer.hasMoreElements()) {
  378. try {
  379. tokenizer = new StringTokenizer(reader.readLine());
  380. } catch (IOException e) {
  381. throw new RuntimeException(e);
  382. }
  383. }
  384. return tokenizer.nextToken();
  385. }
  386.  
  387. public int nextInt() {
  388. return Integer.parseInt(next());
  389. }
  390.  
  391. }
  392.  
  393. // Method untuk mencari pelanggan pada array daftarPelanggan
  394. private static Pelanggan cariPelanggan(int id) {
  395. for (Pelanggan pelanggan: daftarPelanggan) {
  396. if (pelanggan != null){
  397. if (id == pelanggan.getId()) {
  398. return pelanggan;
  399. }
  400. }
  401. }
  402. return null;
  403. }
  404. }
Success #stdin #stdout 0.15s 52584KB
stdin
10
10000 A
10000 G
10000 S
15000 A
15000 G
15000 S
20000 A
20000 G
20000 S
30000 A
10
A G S G A A G S S G
20
6
4
15
5 - 50000
3 + 40000
4 ? 30000 2
1 - 30000
6 - 20000
9 - 50000
8 + 40000
12 ? 30000 4
11 - 30000
10 - 200005
20 + 40000
14 ? 30000 6
7 - 30000
13 - 20000
18 ? 15000 8
13
P 5 10
P 5 10
P 1 10
L
L
P 7 9
P 7 9
B 5
L
B 1
L
L
B 7
15
5 - 50000
3 + 40000
4 ? 30000 2
1 - 30000
6 - 20000
9 - 50000
8 + 40000
12 ? 30000 2
11 - 30000
10 - 200005
20 + 40000
14 ? 30000 1
7 - 30000
13 - 20000
18 ? 15000 2
5
P 1 1
P 1 3
L
L
B 1
12
1 - 20000
7 ? 10000 1
11 ? 100000 2
4 - 20000
5 ? 10000 4
10 - 10000
12 - 10000
13 ? 20000 1
15 ? 30000 2
14 + 30000
17 ? 10000 1
18 - 15000
5
P 17 6
P 17 1
L
L
B 17
11
10 + 10000
5 ? 10000 1
6 - 20000
7 ? 10000 2
17 ? 10000 3
2 ? 10000 3
1 - 20000
11 - 20000
12 - 20000
13 - 20000
14 ? 30000 5
1
C 10
stdout
1 0 1 1 1 1 0 1 2 2 0 2 2 2 2
1
1
1
5
5
3
3
pelanggan dengan id 5 masuk list blacklist
0
1
1
7
7
pelanggan dengan id 7 masuk list blacklist
0
3 0 1 1 1 1 0 1 1 2 0 0 3 2 2
5
8
1
1
1
1 3 1 1 3 1 1 1 2 0 0 2
9
6
17
17
pelanggan dengan id 17 masuk list blacklist
0
0 3 1 3 3 1 1 1 1 1 2
2 4 7 10 8 9 5 6 3 1