Untitled
unknown
plain_text
12 days ago
6.7 kB
10
Indexable
Never
#ifndef _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #endif #include <stdio.h> #include <iostream> using namespace std; extern void init(int mBaseTime, int mBaseFee, int mUnitTime, int mUnitFee, int mCapacity); extern int arrive(int mTime, int mCar); extern int leave(int mTime, int mCar); ///////////////////////////////////////////////////////////////////////// #define CMD_INIT 1 #define CMD_ARRIVE 2 #define CMD_LEAVE 3 static bool run() { int q; scanf("%d", &q); int basetime, basefee, unittime, unitfee, capacity, mtime, mcar; int cmd, ans, ret = 0; bool okay = false; for (int i = 0; i < q; ++i) { scanf("%d", &cmd); switch (cmd) { case CMD_INIT: scanf("%d %d %d %d %d", &basetime, &basefee, &unittime, &unitfee, &capacity); init(basetime, basefee, unittime, unitfee, capacity); okay = true; break; case CMD_ARRIVE: scanf("%d %d %d", &mtime, &mcar, &ans); ret = arrive(mtime, mcar); if (ans != ret) { cout<<"Arrive: "<<ret<<" "<<ans<<endl; okay = false; break; } case CMD_LEAVE: scanf("%d %d %d", &mtime, &mcar, &ans); ret = leave(mtime, mcar); if (ans != ret) { cout<<"Leave: "<<ret<<" "<<ans<<endl; okay = false; break; } default: okay = false; break; } } return okay; } int main() { setbuf(stdout, NULL); freopen("sample_input.txt", "r", stdin); int T, MARK; scanf("%d %d", &T, &MARK); for (int tc = 1; tc <= T; tc++) { int score = run() ? MARK : 0; printf("#%d %d\n", tc, score); } return 0; } /* 1 100 18 1 60 5000 20 300 5 2 10 200 0 2 30 100 0 2 50 700 0 2 80 600 0 3 90 200 5300 2 100 300 0 2 120 800 0 2 140 200 1 2 170 400 2 2 240 900 3 3 300 300 7100 3 310 900 -1 3 340 100 8900 2 350 500 1 2 400 900 2 3 420 200 5300 3 450 900 5000 100 1 121 18809 109 6723 7 2 4689 8965111 0 2 9948 3190676 0 2 12348 890815357 0 2 18667 6559618 0 2 21969 7410995 0 2 23161 9669600 0 2 28989 8358041 0 2 30857 9176750 1 2 31404 6133295 2 2 31691 9211756 3 2 32813 1257077 4 3 33271 6559618 912968 3 40571 9669600 1087766 2 43702 3358940 3 2 46343 3507877 4 2 48198 5835274 5 2 48897 6342555 6 3 53377 6342555 -1 3 59599 8965111 3400478 3 78185 9211756 1161719 2 81955 4727832 4 2 82017 1506673 5 2 86235 6342555 6 3 86335 3358940 -1 2 88258 7123765 6 2 89849 9669600 7 3 92351 7410995 4355144 3 94075 890815357 5054336 2 98637 890815357 6 2 101769 3737550 7 2 103196 5585359 8 3 110311 5835274 1013813 2 112742 3358940 8 3 116273 8358041 5397209 3 121136 5585359 -1 3 125056 9176750 5672852 3 125578 3358940 590264 2 134684 8358041 5 2 135745 9211756 6 2 138091 9176750 7 2 138215 3391221 8 3 141908 6342555 1961756 3 155061 8358041 -1 3 158489 3190676 9175535 2 164773 8358041 6 2 169008 3190676 7 3 172403 3507877 4953491 2 173585 3507877 7 2 174631 991918505 8 2 177862 3024638 9 2 178277 4452159 10 3 179560 9669600 455804 2 181516 6559618 10 2 182242 7127941 11 2 184322 8965111 12 3 191731 4452159 -1 2 194250 5553147 12 2 197669 2130440 13 3 200556 991918505 -1 2 201327 6342555 13 2 203082 1572395 14 2 204363 991918505 15 2 209585 5771907 16 2 211942 4753520 17 3 217344 3737550 3642506 2 218917 4452159 17 2 221161 8591627 18 2 223391 5835274 19 2 225398 9500590 20 2 226434 5585359 21 2 228929 2816733 22 3 229505 7127941 -1 2 229693 8270622 22 2 230059 3358940 23 2 230213 491661 24 2 230302 8527314 25 3 232100 4727832 6614072 2 234403 3737550 25 2 234785 7127941 26 2 236702 9712254 27 2 249160 364095 28 2 250414 5747388 29 2 254432 4574853 30 3 255055 8527314 -1 2 256737 1373085 30 3 259012 3024638 1672667 2 262826 3187149 30 3 268424 8270622 -1 2 269758 6465509 30 2 273007 785196746 31 2 274876 1791195 32 2 285319 989800 33 2 292203 8527314 34 2 295974 3024638 35 2 297005 4727832 36 3 297220 6133295 15844751 3 297679 6559618 -1 2 299347 4402659 35 3 299599 9211756 7420832 #include <unordered_map> #include <set> #include <algorithm> #include <vector> #include <iostream> #include <cstring> using namespace std; struct cmp { bool operator()(pair<int, int> a, pair<int, int> b) const { return a.second < b.second; // So sánh dựa trên thời gian đến } }; set<pair<int, int>, cmp> se; unordered_map<int, int> mp; // Map xe -> thời gian đến unordered_map<int, int> q; // Map xe -> thời gian đến trong hàng đợi vector<int> parking; int baseTime, baseFee, unitTime, unitFee, capacity; void init(int mBaseTime, int mBaseFee, int mUnitTime, int mUnitFee, int mCapacity) { parking.clear(); se.clear(); mp.clear(); q.clear(); // Xóa dữ liệu hàng đợi baseTime = mBaseTime; baseFee = mBaseFee; unitFee = mUnitFee; unitTime = mUnitTime; capacity = mCapacity; } int arrive(int mTime, int mCar) { int capaCur = mp.size(); if (capaCur >= capacity) { // Kiểm tra nếu bãi đầy, thêm vào hàng đợi se.insert(make_pair(mCar, mTime)); q[mCar] = mTime; } else { // Thêm vào bãi đỗ mp[mCar] = mTime; } return se.size(); // Trả về số lượng xe đang trong hàng đợi } int leave(int mTime, int mCar) { int res = 0; // Trường hợp xe không có trong bãi đỗ (tức là xe nằm trong hàng đợi) if (mp.find(mCar) == mp.end()) { auto it = se.find(make_pair(mCar, q[mCar])); if (it != se.end()) { se.erase(it); } return -1; // Xe không có trong bãi đỗ } else { // Xe có trong bãi đỗ int t = mp[mCar]; // Thời gian xe vào bãi int parkedTime = mTime - t; // Thời gian đỗ xe // Tính phí đỗ xe if (parkedTime <= baseTime) { res = baseFee; // Phí cơ bản } else { res = baseFee + ((parkedTime ) / unitTime) * unitFee; // Phí bổ sung theo đơn vị thời gian } // Xóa xe ra khỏi bãi đỗ mp.erase(mCar); // Kiểm tra xem có xe nào trong hàng đợi không và chuyển nó vào bãi nếu còn chỗ if (!se.empty()) { auto it = se.begin(); int carInQueue = it->first; int timeInQueue = it->second; se.erase(it); mp[carInQueue] = timeInQueue; // Di chuyển xe từ hàng đợi vào bãi đỗ q.erase(carInQueue); // Xóa xe khỏi hàng đợi } return res; // Trả về phí đỗ xe } return 0; } */
Leave a Comment