链接
题解
我不知道它怎么过的…但它就是过了
肯定分成正负两种情况去做,正数的我是这么考虑的:每次选择能选的里面能增加最多 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+b1≥a2
r
+
b
2
<
a
1
r+b_2 < a_1
r+b2<a1
加一下再整理整理就得到 a 1 + b 1 > a 2 + b 2 a_1+b_1 > 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;
}