LINK
思维转不过来
题目:
思路:
一开始想错了一直卡着几个点。想法挺有意思的。
一开始目光短浅在排序的时候:
1.若回馈>=丧失,则丧失小的排在前面;
2.若回馈<丧失,则(回馈-丧失)小的排在前。
第一点没问题,但第二点有问题。
首先举个例子反驳一下第二点:
当m=10
此时还剩两个障碍:
3 0,9 2;
按2所说此时应该先撞击3 0(0-3=-3),此后剩下7不足以撞9 2(2-9=-7);
但如果先撞击回馈值大的,即9 2,此后剩下3刚好可以撞3 0,即可以全部撞击完成。
所以2忽略了可撞击的条件即丧失值得影响;
如果用数学来证明一下此观点,即:
综上得,排序应为:
1.若回馈>=丧失,则丧失小的排在前面;
2.若回馈<丧失,则回馈大的排在前;
3.否则(回馈-丧失)小的排在前。
注意:开long long
代码:
#include<bits/stdc++.h>
using namespace std;
// typedef long long ll;
#define int long long
const int mod=1e9+7;
const int N=5e5+10;
struct node{
int a,b,c;
bool operator<(const node& y)const{
if(c>=0&&y.c>=0)return a<y.a;
if(c<0&&y.c<0)return b>y.b;
return c>y.c;
}
}a[N];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t,n,m;cin>>t;
while(t--){
cin>>n>>m;int flag=0;
for(int i=0;i<n;i++){
cin>>a[i].a>>a[i].b;
a[i].c=a[i].b-a[i].a;
}
sort(a,a+n);
for(int i=0;i<n;i++){
if(m<a[i].a){
flag=1;
break;
}else m+=a[i].c;
}
if(flag)cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}