P3619 魔法

Portal.

首先显然可以想到要根据 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 bi0 的部分。假设有 { 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+bjti,则有 T ≤ t i − b j T\leq t_i-b_j Ttibj;又满足 T + b i ≥ t j T+b_i\geq t_j T+bitj,则有 T ≥ t j − b i T\geq t_j-b_i Ttjbi。结合两式有 t i + b i ≥ t j + b j t_i+b_i\geq t_j+b_j ti+bitj+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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值