import java.io.*;
import java.util.*;
class Makanan {
private int harga;
public Makanan
(int harga,
String tipe
){ this.harga=harga;
this.tipe=tipe;
}
return this.tipe;
}
int getHarga(){
return this.harga;
}
}
class Pelanggan {
private int id;
private String statusKesehatan
; private int uang;
private Queue<Makanan> makananDiPesan;
private Queue<Koki> dilayaniKoki;
private int tagihan;
private boolean saatPenuh;
public Pelanggan
(int id,
int uang,
String statusKesehatan
){ this.id=id;
this.statusKesehatan=statusKesehatan;
this.uang=uang;
makananDiPesan = new LinkedList<Makanan>();
dilayaniKoki = new LinkedList<Koki>();
tagihan=0;
}
void saatPenuh(){
this.saatPenuh=true;
}
boolean getKondisiMasuk(){
return this.saatPenuh;
}
void saatSepi(){
this.saatPenuh=false;
}
int getId(){
return this.id;
}
return this.statusKesehatan;
}
void tambahPesanan (Makanan makanan){
makananDiPesan.add(makanan);
tagihan+=makanan.getHarga();
}
int getTagihan(){
return this.tagihan;
}
void resetTagihan(){
this.tagihan=0;
}
Makanan getMakanan() {
return this.makananDiPesan.poll();
}
int getUang(){
return this.uang;
}
Koki getKoki() {
this.makananDiPesan.poll();
return this.dilayaniKoki.poll();
}
void tambahKoki (Koki koki){
this.dilayaniKoki.add(koki);
}
}
class Koki {
private int id;
private int banyakMelayani=0;
public Koki
(int id,
String spesialisasi
){ this.id=id;
this.spesialisasi=spesialisasi;
}
int getId(){
return this.id;
}
return this.spesialisasi;
}
int getBanyakMelayani(){
return this.banyakMelayani;
}
void tambahPelayanan(){
this.banyakMelayani++;
}
}
class lowestComparator implements Comparator<Koki>{
@Override
public int compare(Koki a, Koki b){
// cek pada banyak melayani
if (a.getBanyakMelayani() < b.getBanyakMelayani()) return -1;
else if (a.getBanyakMelayani() == b.getBanyakMelayani()){
// cek pada spesialisasi (sort secara descending)
if (a.getSpesialisasi().compareTo(b.getSpesialisasi())>0){
return -1;
} else if (a.getSpesialisasi().compareTo(b.getSpesialisasi()) == 0){
// cek pada id
if (a.getId() < b.getId()) return -1;
}
}
return 1;
}
}
class TP1 {
private static InputReader in;
// private static Scanner in;
private static ArrayList<Makanan> daftarMakanan; // index arraylist == id/index makanan-1
private static ArrayList<Koki> daftarKoki;
private static ArrayList<Pelanggan> daftarPelanggan; // berlaku selamanya
private static ArrayList<Integer> daftarBlacklist; // isinya id pelanggan dan berlaku selamanya
private static ArrayList<Pelanggan> pelangganDatang; // berlaku pada hari itu
private static ArrayList<Pelanggan> ruangRestoran; // berlaku pada hari itu
private static Queue<Pelanggan> urutanPelanggan; // berlaku pada hari itu
private static HashMap
<String, Integer
> costs
; private static HashMap
<String, Boolean
> foundPackage
;
public static void main
(String[] args
) { in = new InputReader(inputStream);
// Input keperluan makanan lalu buat objek Makanan dan tambahkan ke daftarMakanan
int banyakMakanan = in.nextInt();
daftarMakanan = new ArrayList<Makanan>();
for (int i=0;i<banyakMakanan;i++) {
int harga = in.nextInt();
Makanan makanan = new Makanan(harga, tipe);
daftarMakanan.add(makanan);
}
// Input keperluan koki lalu buat objek Koki dan tambahkan ke daftarKoki
int banyakKoki = in.nextInt();
daftarKoki = new ArrayList<Koki>();
for (int i=0;i<banyakKoki;i++) {
String spesialisasi
= in.
next(); Koki koki = new Koki(i+1, spesialisasi);
daftarKoki.add(koki);
}
int banyakPelanggan = in.nextInt();
daftarBlacklist = new ArrayList<Integer>();
daftarPelanggan = new ArrayList<Pelanggan>();
int banyakKursi = in.nextInt();
int jumlahHari = in.nextInt();
for (int hariKe=1;hariKe<=jumlahHari;hariKe++){
int jumlahPelanggan = in.nextInt();
ruangRestoran = new ArrayList<Pelanggan>();
urutanPelanggan = new LinkedList<Pelanggan>();
pelangganDatang = new ArrayList<Pelanggan>();
for (int pelangganKe=0;pelangganKe<jumlahPelanggan;pelangganKe++) {
// Input keperluan Pelanggan
int id = in.nextInt();
int uang = in.nextInt();
int range;
// Lakukan advance scanning
if (status.equals("?")){
range = in.nextInt();
int neg = 0;
int pos = 0;
for (int i = pelangganKe-range; i<=pelangganKe-1;i++){ // hitung pelanggan positif dan negatif
if (pelangganDatang.get(i).getStatus().equals("+")) pos++;
else neg++;
}
if (neg<pos) status="+";
else status="-";
}
// Buat Objek Pelanggan lalu tambahkan ke daftarPelanggan
Pelanggan pelanggan = new Pelanggan(id, uang, status);
pelangganDatang.add(pelanggan);
if (cariPelanggan(id) != null) daftarPelanggan.remove(cariPelanggan(id));
daftarPelanggan.add(pelanggan);
if (status.equals("-") && !daftarBlacklist.contains(id)){ // Diperbolehkan masuk dan Apabila pelanggan tidak ada di daftar blacklist
ruangRestoran.add(pelanggan);
if (ruangRestoran.size() <= banyakKursi) { // Cek slot
pelanggan.saatSepi();
} else {
pelanggan.saatPenuh();
}
}
}
for (int i=0;i<jumlahPelanggan;i++){
Pelanggan pelanggan = pelangganDatang.get(i);
if (daftarBlacklist.contains(pelanggan.getId())) out.print("3");
else if (pelanggan.getStatus().equals("+")) out.print("0");
else if (pelanggan.getStatus().equals("-") && !pelanggan.getKondisiMasuk()) out.print("1");
else out.print("2");
if (i!=jumlahPelanggan-1) out.print(" ");
}
out.println();
int jumlahPelayanan = in.nextInt();
for (int layananKe=0;layananKe<jumlahPelayanan;layananKe++){
if (perintah.equals("P")){
int idPelanggan = in.nextInt();
int indexMakanan = in.nextInt();
Koki koki=null;
// Cari koki dengan spesialisasi yang dicari dan yang paling sedikit melayani dan yang idnya paling kecil
for (int i=0;i<daftarKoki.size();i++){
if (daftarKoki.get(i).getSpesialisasi().equals(daftarMakanan.get(indexMakanan-1).getTipe())){
if (koki==null){
koki=daftarKoki.get(i);
} else if (koki.getBanyakMelayani() > daftarKoki.get(i).getBanyakMelayani()){
koki=daftarKoki.get(i);
} else if (koki.getBanyakMelayani() == daftarKoki.get(i).getBanyakMelayani()){
if (koki.getId() > daftarKoki.get(i).getId()){
koki=daftarKoki.get(i);
}
}
}
}
Pelanggan pelanggan = cariPelanggan(idPelanggan);
pelanggan.tambahPesanan(daftarMakanan.get(indexMakanan-1));
pelanggan.tambahKoki(koki);
urutanPelanggan.add(pelanggan);
out.println(koki.getId());
// return id koki yg mengambil pesanan
} else if (perintah.equals("L")){
Pelanggan pelanggan = urutanPelanggan.poll();
Koki koki = pelanggan.getKoki();
koki.tambahPelayanan();
out.println(pelanggan.getId());
// return id pelanggan yg memesan
} else if (perintah.equals("B")){
int idPelanggan = in.nextInt();
Pelanggan pelanggan = cariPelanggan(idPelanggan);
if (pelanggan.getUang() < pelanggan.getTagihan()){
out.println("pelanggan dengan id " + idPelanggan + " masuk list blacklist");
daftarBlacklist.add(pelanggan.getId());
out.println(0);
} else{
out.println(1);
}
pelanggan.resetTagihan();
ruangRestoran.remove(pelanggan);
// return mencukupi/tidak
} else if (perintah.equals("C")){
int q = in.nextInt();
ArrayList<Koki> copyOfDaftarKoki = new ArrayList<Koki>();
copyOfDaftarKoki.addAll(daftarKoki);
Collections.
sort(copyOfDaftarKoki,
new lowestComparator
()); for (int i=0;i<q;i++) {
if (i<q-1) out.print(copyOfDaftarKoki.get(i).getId() + " ");
else out.println(copyOfDaftarKoki.get(i).getId());
}
// return id koki berada pada urutan ke q teratas
} else if (perintah.equals("D")){
int costA = in.nextInt();
int costG = in.nextInt();
int costS = in.nextInt();
costs
= new HashMap
<String, Integer
>(); costs.put("A", costA);
costs.put("G", costG);
costs.put("S", costS);
foundPackage
= new HashMap
<String , Boolean
>(); foundPackage.put("A", false);
foundPackage.put("G", false);
foundPackage.put("S", false);
out.println(paketTermurah(0));
// harga minimum utk dpt membeli seluruh daftarMakanan makanan
}
}
}
out.close();
}
public static int paketTermurah(int start){
if (start==daftarMakanan.size()) return 0;
for (int i=start; i<daftarMakanan.size(); i++){
int temp=0;
if (daftarMakanan.get(start).getTipe().equals(daftarMakanan.get(i).getTipe())){
if (i==start) {
temp = daftarMakanan.get(start).getHarga() + paketTermurah(i+1);
} else if (daftarMakanan.get(start).getTipe().equals("A")) {
if (foundPackage.get("A")) {
continue;
} else {
foundPackage.replace("A", true);
temp = costs.get("A")*(i-start+1) + paketTermurah(i+1);
foundPackage.replace("A",false);
}
} else if (daftarMakanan.get(start).getTipe().equals("G")) {
if (foundPackage.get("G")) continue;
else {
foundPackage.replace("G", true);
temp = costs.get("G")*(i-start+1) + paketTermurah(i+1);
foundPackage.replace("G",false);
}
} else {
if (foundPackage.get("S")) continue;
else {
foundPackage.replace("S", true);
temp = costs.get("S")*(i-start+1) + paketTermurah(i+1);
foundPackage.replace("S",false);
}
}
ans
= Math.
min(temp, ans
); }
}
return ans;
}
// taken from https://c...content-available-to-author-only...s.com/submissions/Petr
// together with PrintWriter, these input-output (IO) is much faster than the
// usual Scanner(System.in) and System.out
// please use these classes to avoid your fast algorithm gets Time Limit
// Exceeded caused by slow input-output (IO)
static class InputReader {
}
while (tokenizer == null || !tokenizer.hasMoreElements()) {
try {
}
}
return tokenizer.nextToken();
}
public int nextInt() {
}
}
// Method untuk mencari pelanggan pada array daftarPelanggan
private static Pelanggan cariPelanggan(int id) {
for (Pelanggan pelanggan: daftarPelanggan) {
if (pelanggan != null){
if (id == pelanggan.getId()) {
return pelanggan;
}
}
}
return null;
}
}