题意:
就是给你一个土球,和初始稳定性,然后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;
}
总结:
多多思考,考虑情况和贪心情况。