π λ§ν¬
https://www.acmicpc.net/problem/20665
π€― νμ€ νκΈ°
κ·Έλ₯ γ ‘γ ‘ λ μμ€ κ°μ§λ§
π€· λ¬Έμ
π©π» νμ΄
λν μ€λΉλ‘ Shake! 2020 μ
μ νμ΄λ³΄μλ€. νμ€ν λνλ³ μμ μ μ κ±°μΉ μ¬λλ€λ§ λμ€λ λνλ€λ³΄λ λ¬Έμ κ° μ΄λ €μ λ€ :-(
λν λ κ°μ₯ λ§μ μ λ΅λ₯ μ 보μ νμ κ² κ°μ Aλ² λ¬Έμ
μμ 보기λ§ν΄λ μ΄μ§λ¬μμ§λ λ¬Έμ μ΄λ€. ννΈκ° κΈλ κΈΈκ³ κ·Έλ¦Όλ λμ€κ³
νμ§λ§ μ½μ΄λ³΄λ©΄ μ¬μ€ n μλ κ΅μ₯ν μκ³ κ·Έλ₯ bruteforce λ‘ λ€ λλ €λ³΄λ©΄ λλ€. λ€λ§,, ꡬνμ΄ μ‘°κΈ λΉ‘μΌνΈ? μ²μμ μ§λ κ²μ λ¨Ήκ³ κ·Έλ¦¬λμΈκ°.. νλ©° νμ΄ μκ°νλλ° μκ°μ λ무 μμλ€.
λ€μν νμ΄ λ°©λ²μ΄ μ‘΄μ¬ν κ² κ°μλ° λλ timetable[h][m][seat] 3μ°¨μ λ°°μ΄μ λ§λ€μ΄μ ν΄λΉμκ°μ ν΄λΉ seatμ μμ μλ μ¬λμ΄ μ‘΄μ¬νλ€λ©΄ 1λ‘ μ²΄ν¬νκ³ , λ§μ§λ§μ κ΄λ¦¬μκ° μμ μ μλ μ리λ₯Ό μ°Ύμ λλ timetable[h][m][P] κ°μ΄ 0μΌ λλ§λ€ 1λΆμ© μΆκ°ν΄μ€¬λ€.
timeμ μ²μμ sort ν΄μ£Όμλ€. sortλ μμμκ°μ΄ λ¨Όμ μΈ μ¬λλΆν°, κ·Έλ¦¬κ³ μ’
λ£μκ°μ΄ λ 짧μ μ¬λλΆν°.
seatλ₯Ό κ³ λ₯Όλλ νμ¬ μκ°λμ μλ¦¬κ° λΉμ΄μλ λͺ¨λ seat λ§λ€ κ°μ₯ κ°κΉμ΄ μλ μ¬λκ³Όμ 거리λ₯Ό κ΅¬ν΄ μ΅μ’
μ μΌλ‘ μ΄ κ±°λ¦¬κ° κ°μ₯ λ¨Ό μ리 λ²νΈλ₯Ό 골λΌμ£Όμλ€.
μ리 λ²νΈκ° λμ€λ©΄ μ΄μ ν΄λΉ μ¬λμ start time ~ end time κΉμ§ λͺ¨λ timetableμ 1λ‘ λ°κΏμ£Όμλ€.
μ΄ κ³Όμ μμ μ¬μ€ λλ κ΅μ₯ν μ§κ΄μ μΌλ‘ μ κ·Όνκ±°λΌ μΌμ΄μ€λ₯Ό λ§μ΄ λλ μ€μΌ νλ€. λ μ’μ λ°©λ²μ΄ μμ κ² κ°λ€.
μ
λ ₯ μκ° κ°μ΄ 4μ리 μ«μλ‘ λμ€λλ° /100, mod 100 μ°μ°μ ν΅ν΄ μ½κ² μκ°κ³Ό λΆμ ꡬν μ μλ€.
π» μ½λ
//AC
//BOJ 20666 λ
μμ€ κ±°λ¦¬λκΈ°
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <tuple>
using namespace std;
int N, T, P;
int timetable[25][60][101]; // s, m, seat
struct Time{
int startT;
int startM;
int endT;
int endM;
};
bool cmp (const Time &a, const Time &b) {
if (a.startT == b.startT) {
if (a.startM == b.startM) {
if (a.endT == b.endT) {
return a.endM < b.endM;
}
return a.endT < b.endT;
}
return a.startM < b.startM;
}
return a.startT < b.startT;
}
auto distance(int index, int h, int m) {
int distance = 987654321;
int minIndex = 1;
for (int i = 1; i <= N; i++) {
if (index == i) continue;
if (timetable[h][m][i]) {
int d = abs(index - i);
if(distance > d) {
distance = d;
minIndex = i;
}
}
}
return tuple(distance, minIndex);
}
int findSeat (int h, int m) {
int index = 1;
int maxDis = 0;
for(int i = 1; i<=N; i++) {
if (!timetable[h][m][i]) {
auto[md, mi] = distance(i, h, m);
if(md > maxDis) {
maxDis = md;
index = i;
}
}
}
return index;
}
vector<Time> v;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int a, b, res = 0;
cin >> N >> T >> P;
for(int i=0; i<T; i++) {
cin >> a >> b;
int sT = a / 100;
int sM = a % 100;
int eT = b / 100;
int eM = b % 100;
v.push_back({sT, sM, eT, eM});
}
sort(v.begin(), v.end(), cmp);
for (Time t: v) {
int sT = t.startT; int sM = t.startM;
int eT = t.endT; int eM = t.endM;
int idx = findSeat(sT, sM);
for(int i = sT; i <= eT; i++) {
if(sT == eT) {
for(int j=sM; j < eM; j++) {
timetable[i][j][idx] = 1;
}
break;
}
if(i == sT) {
for(int j=sM; j<=59; j++) {
timetable[i][j][idx] = 1;
}
}
else if(i == eT) {
for(int j=0; j<eM; j++) {
timetable[i][j][idx] = 1;
}
}
else {
for(int j=0; j<=59; j++) {
timetable[i][j][idx] = 1;
}
}
}
}
for (int i = 9; i <= 20; i++) {
for (int j = 0; j <= 59; j++) {
if (!timetable[i][j][P]) {
res += 1;
}
}
}
cout << res;
return 0;
}
'DEV > PS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[BOJ/20218] Parity Constraint Shortest Path, c++ (1) | 2021.08.28 |
---|---|
[BOJ/20666] μΈλ¬Όμ΄μ μ μ, c++ (2) | 2021.08.20 |
[BOJ/11280] 2-SAT - 3, c++ (2) | 2021.08.19 |
[BOJ/17222] μμ€ν€ κ±°λ, c++ (2) | 2021.08.12 |
[BOJ/13904] κ³Όμ , c++ (0) | 2021.08.10 |