题解 P1280 【尼克的任务】

officeyutong

2017-09-28 22:19:32

Solution

#蒟蒻的题解 其实也就是一个分组背包而已..以任务开始的时间分组,所有开始时间相同的任务在同一组内 ```cpp #include <cstdio> #include <iostream> #include <vector> #include <array> #include <algorithm> #include <functional> #include <cstdlib> #include <map> using namespace std; using int_t = unsigned long long int; int main() { int_t timeLimit, count; cin >> timeLimit>>count; //数据存在map里 map[任务开始时间] map<int_t, vector < int_t>> tasks; for (int i = 1; i <= count; i++) { int_t start, cost; cin >> start>>cost; tasks[start].push_back(cost); } int_t dp[10001] = {0}; //开始dp for (int_t time = timeLimit; time >= 1; time--) { //如果当前时间点没有任务开始,则直接改为上一点的值+1 if (tasks.find(time) == tasks.end()) { dp[time] = dp[time + 1] + 1; continue; } vector<int_t> &vec = tasks[time]; //选择任务之前先对任务的结束时间从大到小排序 sort(vec.begin(), vec.end()); for (auto ptr = vec.begin(); ptr < vec.end(); ptr++) { dp[time] = max(dp[time], dp[time + *ptr]); } } cout << dp[1]; } ```