Untitled
unknown
plain_text
2 years ago
3.3 kB
6
Indexable
---------------MAIN------------------------ #ifndef _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #endif #include <stdio.h> #include <string.h> struct Result { int mPrice; int mPerformance; }; extern void init(int mCharge); extern Result order(int mBudget); extern int stock(int mType, int mPerformance, int mPrice, int mPosition); ///////////////////////////////////////////////////////////////////////// #define INIT 0 #define STOCK 1 #define ORDER 2 static bool run() { int cmd, ans, ans2, ret; int in, in2, in3, in4; int Q = 0; bool okay = false; Result Ret; scanf("%d", &Q); for (int q = 0; q < Q; ++q) { scanf("%d", &cmd); switch (cmd) { case INIT: scanf("%d", &in); init(in); okay = true; break; case STOCK: scanf("%d %d %d %d", &in, &in2, &in3, &in4); ret = stock(in, in2, in3, in4); scanf("%d", &ans); if (ret != ans) okay = false; break; case ORDER: scanf("%d", &in); Ret = order(in); scanf("%d %d", &ans, &ans2); if (Ret.mPrice != ans || Ret.mPerformance != ans2) okay = false; break; default: okay = false; } } 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; } ---------------USER------------------------ #define MAX_STOCK 4007 #define min(a, b) ((a < b) ? (a) : (b)) int Charge; struct Result { int mPrice; int mPerformance; }; struct Node { int price, per; } Pool[MAX_STOCK]; int idPool; int stocks[2][3][MAX_STOCK]; int cnt[2][3]; void init(int mCharge) { for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) cnt[i][j] = 0; Charge = mCharge; idPool = 1; } int stock(int mType, int mPrice, int mPerformance, int mPosition) { Pool[idPool].price = mPrice; Pool[idPool].per = mPerformance; stocks[mPosition][mType][cnt[mPosition][mType]++] = idPool++; return cnt[mPosition][mType]; } Result order(int mBudget) { Result res = { 0, 0 }; int l = 0, h = 1000000; int Rprice = 0; while (l < h-1) { int p1[2][3]; int p2[3]; int mid = (l + h)/2; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { int Min = 1000000; for (int m = 0; m < cnt[i][j]; m++) { int id = stocks[i][j][m]; if (Pool[id].per >= mid && Pool[id].price < Min) Min = Pool[id].price; } p1[i][j] = Min; } } for (int i = 0; i < 3; i++) p2[i] = min(p1[0][i], p1[1][i]); int price = min(min(p1[0][0] + p1[0][1] + p1[0][2], p1[1][0] + p1[1][1] + p1[1][2]), p2[0] + p2[1] + p2[2]+Charge); if (price <= mBudget) { l = mid; Rprice = price; } else h = mid; } res.mPrice = Rprice; res.mPerformance = l; return res; }
Editor is loading...