首先显然可以想到要根据 b i b_i bi 的正负分类处理。
先处理 b i > 0 b_i>0 bi>0 的部分,这部分的贪心很好想,按照 t i t_i ti 排序,先处理时间门槛低的任务,同时还可以为后面时间门槛高的任务增加 T T T 的值。
考虑如何处理 b i ≤ 0 b_i\leq0 bi≤0 的部分。假设有 { t i , b i } , { t j , b j } \{t_i,b_i\},\{t_j,b_j\} {ti,bi},{tj,bj},我们令 i i i 必须在 j j j 前取到,则满足 T + b j ≤ t i T+b_j\leq t_i T+bj≤ti,则有 T ≤ t i − b j T\leq t_i-b_j T≤ti−bj;又满足 T + b i ≥ t j T+b_i\geq t_j T+bi≥tj,则有 T ≥ t j − b i T\geq t_j-b_i T≥tj−bi。结合两式有 t i + b i ≥ t j + b j t_i+b_i\geq t_j+b_j ti+bi≥tj+bj。按照该式排序贪心处理即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e5+5;
struct node{int t,b;}a[maxn],b[maxn];
bool cmp1(node a,node b){return a.t<b.t;}
bool cmp2(node a,node b){return a.t+a.b>b.t+b.b;}
signed main()
{
int Z;cin>>Z;
while(Z--)
{
int n,T;cin>>n>>T;
int cnt1=0,cnt2=0;
for(int i=1;i<=n;i++)
{
int tt,bb;cin>>tt>>bb;
if(bb>0) a[++cnt1].t=tt,a[cnt1].b=bb;
else b[++cnt2].t=tt,b[cnt2].b=bb;
}
sort(a+1,a+cnt1+1,cmp1),sort(b+1,b+cnt2+1,cmp2);
bool flag=1;
for(int i=1;i<=cnt1;i++)
{
if(T<=a[i].t){flag=0;break;}
T+=a[i].b;
if(T<=0){flag=0;break;}
}
for(int i=1;i<=cnt2;i++)
{
if(T<=b[i].t){flag=0;break;}
T+=b[i].b;
if(T<=0){flag=0;break;}
}
if(flag) cout<<"+1s\n";
else cout<<"-1s\n";
}
return 0;
}