思路:
记得之前做过一个背包的题,就用到过这种类似思想的排序关系、这个题交了3次,前两次都是认为如果空间利用率 也就是做除法比值大就可以,但是2.4号测试点过不去。
就想了想这种特殊的排序方法果然过去了。
个人感觉这种排序的方法的大体想法是:
如果当前这个任务可以省下的空间比下一个大,就优先执行当前的。
其次:想记录下为什么说取比值的方法不对:
2
4 2
8 4
对于这样类型的数据,首先无法判别优先级关系,其次比值的大小所代表的意义仅在于当前数据,而并未像数据结构那样所学的在整体角度考虑问题。觉得贪心的题型并不单纯的是选择关系,都说其难点在于验证此题是个贪心,我觉得就下次再想贪心的时候,多想想当前贪心思想的含义对于后续的影响或许会好一点
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm >
using namespace std;
struct node
{
int time,save;
}a[100005];
int cmp(node x,node y)
{
return x.time-x.save>y.time-y.save;
}
int main()
{
int res=0,ans=0,fir=0;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].time>>a[i].save ;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
if(res<a[i].time)
{
ans+=a[i].time-res;
res=a[i].time-a[i].save;
}
else
res-=a[i].save;
}
cout<<ans<<endl;
}