# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
18579 | 2016-02-09T14:50:37 Z | jjhstop | 올림픽 피자 (tutorial5) | C++ | 0 ms | 0 KB |
#include "pizza.h" #include <queue> using namespace std; queue<int> Q[256]; int order_num; int ingred[9]; int delivered; void Init() { order_num = 0; } void Order(int N, int *A) { int ordering = 0; for (int i = 0; i < N; i++) { ordering |= (1 << A[i]); } if ((ordering & delivered) == ordering) { Bake(order_num); for (int i = 0; i < 8; i++) { if (ordering & (1 << i)) { ingred[i]--; if (ingred[i] == 0) delivered ^= (1 << i); } } } else { Q[ordering].push(order_num); } order_num++; } int check(int a) { for (int i = 0; i< 8; ++i) { if (((a >> i) & 1) && (ingred[i] == 0)) return 0; } return 1; } void Delivery(int i) { ingred[i]++; if (ingred[i] == 1) { delivered |= (1 << i); } int minidx = -1; int min = 99999; for (int i = 0; i < 256; i++) { if (!Q[i].empty() && check(i)) { if (Q[i].front() < min) { min = Q[i].front(); minIdx = i; } } } if (minIdx != -1) { Bake(Q[minIdx].front()); Q[min_i].pop(); for (int i = 0; i < 8; i++) { if (min_i & (1 << i)) { ingred[i]--; if (ingred[i] == 0) delivered ^= (1 << i); } } } }