Codeforces Round #579 (Div. 3) F1. Complete the Projects (easy version)

本文深入探讨了竞赛编程中的一种高效解题策略,通过分析题目特点,提出正数和负数情况下的不同处理方法。正数情况下,优先选择能显著提升评分的方案;负数情况下,依据特定排序规则进行选择。文章提供了代码实现,并通过实例验证了策略的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接

点击看题

题解

我不知道它怎么过的…但它就是过了

肯定分成正负两种情况去做,正数的我是这么考虑的:每次选择能选的里面能增加最多 r a t i n g rating rating的去做

负数的就是一种感觉吧,手写了几组样例发现按照 a i + b i a_i+b_i ai+bi从大到小的顺序选就可以,然后写了一发就过了

感觉大概是这么一回事:
r + b 1 ≥ a 2 r+b_1 \geq a_2 r+b1a2
r + b 2 &lt; a 1 r+b_2 &lt; a_1 r+b2<a1

加一下再整理整理就得到 a 1 + b 1 &gt; a 2 + b 2 a_1+b_1 &gt; a_2+b_2 a1+b1>a2+b2

当然这不是证明只是瞎推导一下

代码

#include <bits/stdc++.h>
#define maxn 200010
#define maxe 10000010
#define linf (1ll<<60)
#define iinf 0x3f3f3f3f
#define cl(x) memset(x,0,sizeof(x))
#define rep(_,__) for(_=1;_<=(__);_++)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int n, T, ans, a[maxn], b[maxn], mark[maxn];
vector<pii> pos, neg;
int yes()
{
	cout<<"YES";
	return 0;
}
int no()
{
	cout<<"NO";
	return 0;
}
int main()
{
    int i, r, cnt=0, m, j, t;
    cin>>n>>r;
	rep(i,n)
	{
		cin>>a[i]>>b[i];
		if(b[i]>=0)pos.emplace_back(pii(a[i],b[i]));
		else neg.emplace_back(pii(a[i],b[i]));
	}
	sort(pos.begin(),pos.end(),[](pii x, pii y){return x.second>y.second;});
	sort(neg.begin(),neg.end(),[](pii x, pii y){return x.first+x.second>y.first+y.second;});
	for(i=0;i<pos.size();i++)
	{
		for(j=0;j<pos.size();j++)
			if(!mark[j] and pos[j].first<=r)
				break;
		if(j==pos.size())return no();
		r+=pos[j].second;
		mark[j]=1;
	}
	cl(mark);
	for(i=0;i<neg.size();i++)
	{
		if(r<neg[i].first)return no();
		r+=neg[i].second;
	}
	if(r>=0)return yes();
	else return no();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值