题意:有n项工作,每项工作都有一个Vi和ai,表示当你的能量大于等于Vi值时才能去做这项工作,完成后能量增加ai,且完成过程中不消耗能量。如果要完成n项工作,最小的初始能量为多少。
解题思路:将所有工作按照Vi从小到大排序,依次做任务既是最优情况,记sum[i] = a1+a2+......+ai,完成所有工作所需的最小初始能力值即为ans= max(vi-sum[i-1]),详细解释为:将每次完成上次工作后的自身能量与当前所做工作的Vi的差值累加,详见代码。
Code:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct Node
{
int v,a;
bool operator < (const Node &b) const
{
return v<b.v;
}
}Job[10010];
int main()
{
int n;
while(scanf("%d",&n))
{
for(int i = 0; i<n; i++)
scanf("%d%d",&Job[i].v,&Job[i].a);
sort(Job,Job+n);
int tmp = 0,ans = 0;//tmp保存每次完成工作后所拥有的精力
for(int i = 0; i<n; i++)
{
if(Job[i].v > tmp)//当下次的V值大于所拥有的精力
{
ans +=Job[i].v - tmp;//则ans记录差值
tmp = Job[i].v;//将Job[i].v赋给tmp
}
tmp+=Job[i].a;//tmp加上i的a值相当于此时完成了此项工作
}
printf("%d\n",ans);
}
return 0;
}