标签:std ack back csp .com 资格认证 push targe log
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址
题目的核心是把每一个上下课表示成两个取放钥匙的动作,然后对动作进行排序。
首先根据时间的先后排序。
时间相同,根据取放排序,先放后取。
时间相同,是相同的操作,先房间号低的操作。
具体来说,需要构建一个Action对象,同时定义operator<方法。
C++
#include <stdio.h> #include <algorithm> #include <vector> using namespace std; struct Action { int room; int time; int type; // 0:put, 1:get Action(int room_, int time_, int type_) : room(room_), time(time_), type(type_) {} bool operator<(const Action &other) const { if(time<other.time) return true; else if(time==other.time && type<other.type) return true; else if(time==other.time && type==other.type && room<other.room) return true; return false; } }; int main() { int N, K; scanf("%d%d", &N, &K); vector<Action> actions; vector<int> states(N+1); for(int n=1; n<=N; n++) states[n] = n; for(int k=0; k<K; k++) { int room, begin, length; scanf("%d%d%d", &room, &begin, &length); actions.push_back(Action(room, begin, 1)); actions.push_back(Action(room, begin+length, 0)); } sort(actions.begin(), actions.end()); for(int i=0; i<actions.size(); i++) { Action &act = actions[i]; //printf("%d %d %d\n", act.room, act.time, act.type); if(act.type == 0) { // put for(int n=1; n<=N; n++) { if(states[n] == -1) { states[n] = act.room; break; } } } else { // get for(int n=1; n<=N; n++) { if(states[n] == act.room) { states[n] = -1; break; } } } } for(int n=1; n<=N; n++) { printf("%d ", states[n]); } }
标签:std ack back csp .com 资格认证 push targe log
原文地址:http://www.cnblogs.com/meelo/p/7646680.html