牛客月赛19-巨石滚滚-(细节贪心)

H

题意:
就是给你一个土球,和初始稳定性,然后n个障碍,一个障碍会让你失去a的稳定性,和获得b的稳定性。你可以任意排序,问你在不被撞散架的情况下,能否把所有的障碍撞完。

思考:
刚开始想傻逼了,就想按b-a越大的开始撞。实际上不一定,因为b-a大的你的初始值不一定大于a。这个题是先撞再拿能量,不是同时的。所以就先考虑撞哪些b-a>=0的,按a从小到大排序。然后再取撞b-a<0的,这次排序要按b从大到小排序,因为每个障碍我肯定都要去撞,为何不拿b最多的开始呢,比如初始为10障碍为4 1 和10 5。肯定先撞5的,如果先撞1的就撞不了10的了。

代码:

int T,n,m,k;
PII va[N];

bool cmp1(PII A,PII B)
{
	if(A.fi!=B.fi) return A.fi<B.fi;
	return A.se>B.se;
}

bool cmp2(PII A,PII B)
{
	return A.se>B.se;
}

signed main()
{
	IOS;
	cin>>T;
	while(T--)
	{
		cin>>n>>m;
		vector<PII > v1,v2;
		for(int i=1;i<=n;i++)
		{
			cin>>va[i].fi>>va[i].se;
			if(va[i].se-va[i].fi>=0) v1.pb(va[i]);
			else v2.pb(va[i]);
		}
		sort(v1.begin(),v1.end(),cmp1);
		sort(v2.begin(),v2.end(),cmp2);
		int suc = 1;
		for(int i=0;i<v1.size();i++)
		{
			if(m<v1[i].fi) suc = 0;
			m += v1[i].se-v1[i].fi;
		}
		for(int i=0;i<v2.size();i++)
		{
			if(m<v2[i].fi) suc = 0;
			m += v2[i].se-v2[i].fi;
		}
		if(suc) cout<<"Yes\n";
		else cout<<"No\n";
	}
	return 0;
}

总结:
多多思考,考虑情况和贪心情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值