Tasks and Deadlines(Sorting and Searching)
题目描述
You have to process n tasks. Each task has a duration and a deadline, and you will process the tasks in some order one after another. Your reward for a task is d-f where d is its deadline and f is your finishing time. (The starting time is 0, and you have to process all tasks even if a task would yield negative reward.)
What is your maximum reward if you act optimally?
输入
The first input line has an integer n(1 ≤ n ≤ ): the number of tasks.
After this, there are n lines that describe the tasks. Each line has two integers a and d(1 ≤ a,d ≤ ): the duration and deadline of the task.
输出
Print one integer: the maximum reward.
样例输入
3
6 10
8 15
5 12
样例输出
2
思路分析
贪心、排序。
本题排序原则可以用数学表达式解释。
设起始时间T。
对于任务a和任务b,先a后b的情况下reward为a.deadline-T+b.deadline-(T+a.duration);
先b后a的情况下reward为b.deadline-T+a.deadline-(T+b.duration)。
化简约分下来发现,如果b.duration>a.duration,则a排在b前面。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,a,d,ans;
struct node{ll duration,deadline;
};
vector<node>task;
bool cmp(node&a,node&b){return b.duration>a.duration;
}
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n;for(int i=0;i<n;i++){cin>>a>>d;task.push_back({a,d});}sort(task.begin(),task.end(),cmp);ll t=0;for(node i:task){t+=i.duration;ans+=i.deadline-t;}cout<<ans;return 0;
}