아.. 시뮬레이션..... 못풀었다. 어렵다 .
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#include <stdio.h>
#include <math.h>
#include <sstream>
#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()
#define NOT_USING -1
#define INCONSISTENT -1
using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using iis = pair<int, string>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;
struct Input {
int a;
string b, c, d;
};
struct Car {
// 원가, 초기 대여 비용, 주행 거리 1 킬로미터당 추가되는 비용
i64 p, q, k;
};
struct Rental {
int t;
string carName;
};
template <typename T>
bool checkKeyExist(string s, map<string, T> &m) {
if (m.find(s) == m.end()) {
return false;
}
return true;
}
void solve() {
int n, m;
cin >> n >> m;
map<string, Car> carInfo;
for (int i = 0; i < n; i++) {
string carName;
Car c;
cin >> carName >> c.p >> c.q >> c.k;
carInfo[carName] = c;
}
// 대여정보 t를 기준으로 정렬함
vector<string> names(m);
vector<Input> v(m);
for (int i = 0; i < m; i++) {
Input in;
cin >> in.a >> in.b >> in.c >> in.d;
names[i] = in.b;
v[i] = in;
}
sort(all(v), [](const Input& l, const Input& r) {
return l.a < r.a;
});
map<string, Rental> rentalInfo; // t가 -1이면 대여중이 아님
map<string, i64> priceInfo; // 가격이 -1이면 잘못된 값
for (int i = 0; i < m; i++) {
int t = v[i].a;
string name = v[i].b, e = v[i].c;
// cout << "\n" << v[i].a << " " << v[i].b << " " << v[i].c << " " << v[i].d << "\n";
if (priceInfo[name] == INCONSISTENT)
continue;
if (e == "p") {
string carName = v[i].d;
// 두 번 이상 대여할 수 없다
if (checkKeyExist<Rental>(name, rentalInfo) && rentalInfo[name].t != NOT_USING) {
// cout << "p 두 번 이상 대여할 수 없다" << "\n";
priceInfo[name] = INCONSISTENT;
continue;
}
// 없는 차를 대여할 수 없다
if (checkKeyExist<Car>(carName, carInfo) == false) {
// cout << "p 없는 차를 대여할 수 없다" << "\n";
priceInfo[name] = INCONSISTENT;
continue;
}
Rental r;
r.t = t;
r.carName = carName;
rentalInfo[name] = r;
} else if (e == "r") {
int d = stoi(v[i].d); // 주행거리
// 대여했는지 확인한다
if (!checkKeyExist<Rental>(name, rentalInfo) || rentalInfo[name].t == NOT_USING) {
// cout << "r 대여하지 않았다" << "\n";
priceInfo[name] = INCONSISTENT;
continue;
}
rentalInfo[name].t = NOT_USING;
// 초기 비용을 더한다
// 추가요금을 함께 계산한다
priceInfo[name] += carInfo[rentalInfo[name].carName].q + carInfo[rentalInfo[name].carName].k * d; // 초기비용 + 주행거리 비용
} else if (e == "a") {
double s = stod(v[i].d);
// 대여했는지 확인한다
if (!checkKeyExist<Rental>(name, rentalInfo) || rentalInfo[name].t == NOT_USING) {
// cout << "r 대여하지 않았다" << "\n";
priceInfo[name] = INCONSISTENT;
continue;
}
// 원가 * 파손율 더한다 -> 소수점이라면 올림한다
priceInfo[name] += (i64) ceil(carInfo[rentalInfo[name].carName].p / 100.0 * s);
}
}
// 사전순으로 정렬한 형태
sort(all(names));
names.erase(unique(names.begin(), names.end()), names.end());
// Rental 비용 청구
for (int i = 0; i < names.size(); i++) {
// 반납되지 않은 차라면 INCONSISTENT
if (rentalInfo[names[i]].t != NOT_USING) {
cout << names[i] << " " << "INCONSISTENT\n";
continue;
}
if (priceInfo[names[i]] == INCONSISTENT) {
cout << names[i] << " " << "INCONSISTENT\n";
continue;
}
cout << names[i] << " " << priceInfo[names[i]] << "\n";
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
int t;
cin >> t;
for (int i = 0; i < t; i++) {
solve();
}
return 0;
}
'백준' 카테고리의 다른 글
14615 Defend the CTP!!! (0) | 2022.07.30 |
---|---|
24778 Cracking The Safe (0) | 2022.07.30 |
20390 완전그래프의 최소 스패닝 트리 (0) | 2022.07.16 |
16493 최대 페이지 수 (0) | 2022.07.09 |
14621 나만 안되는 연애 (0) | 2022.07.09 |