CF799B T-shirt buying
题目大意
有一些衣服,它们有价格、正面的颜色和反面的颜色。现有一群顾客按顺序来买存在某颜色且价格最低的衣服(不存在则不会买),求每个顾客花了多少钱。
思路
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int MAX_OBJ = 200010, MAX_COLOR = 5; int TotObj; struct Obj { int Price, A, B; bool Vis; }_objs[MAX_OBJ]; struct Cmp { bool operator () (Obj *a, Obj *b) { return a->Price > b->Price; } }; priority_queue<Obj*, vector<Obj*>, Cmp> q[3][MAX_COLOR]; int main() { scanf ( "%d" , &TotObj); for ( int i = 1; i <= TotObj; i++) scanf ( "%d" , &_objs[i].Price); for ( int i = 1; i <= TotObj; i++) { scanf ( "%d" , &_objs[i].A); q[1][_objs[i].A].push(_objs + i); } for ( int i = 1; i <= TotObj; i++) { scanf ( "%d" , &_objs[i].B); q[2][_objs[i].B].push(_objs + i); } int opCnt; scanf ( "%d" , &opCnt); while (opCnt--) { int color; scanf ( "%d" , &color); while (!q[1][color].empty() && q[1][color].top()->Vis) q[1][color].pop(); Obj *obj1 = q[1][color].empty() ? NULL : q[1][color].top(); while (!q[2][color].empty() && q[2][color].top()->Vis) q[2][color].pop(); Obj *obj2 = q[2][color].empty() ? NULL : q[2][color].top(); Obj *ans = obj1 && obj2 ? (obj1->Price < obj2->Price ? obj1 : obj2) : obj1 ? obj1 : obj2; bool Is1 = obj1 && obj2 ? (obj1->Price < obj2->Price) : (obj1 != NULL); if (!ans) printf ( "-1 " ); else { printf ( "%d " , ans->Price); ans->Vis = true ; q[Is1 ? 1 : 2][Is1 ? ans->A : ans->B].pop(); } } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步