본문 바로가기

백준

9367 관리 난항

아.. 시뮬레이션..... 못풀었다. 어렵다 .

 

#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