/*
如果x < 0,它会立刻散架
冲撞会损耗ai稳定性,回馈bi的稳定性
合理安排顺序,保证不散架,将障碍全部摧毁
思路:肯定是先上小的(是么),积蓄力量,攻克大的
故而一开始先排小的,处理完小的再看大的能否处理
是咩:若是这样的呢
1
6 3
1 0
1 0
1 0
3 3
3 3
3 3
那我没了啊
那我每次选择(a-b)>=0 && a<=m先收入囊中
这样排序来贪心,数据的多大肯定超时;没事我试试
果真没了,%35,但有一个答案错误,这是为什么呢
我排序,把比m小反馈多的先吃掉,每次都排一次
这样保证每一次都尽可能吃掉自己接受的,且消耗少
为啥会出错呢?不知道,我一定要换个思路
还是先吃小怪,达到峰值,再吃大怪
小怪怎么吃呢 bi-ai&&ai<m吃了之后得到
会不会出现这种情况,那我排小怪就死定了,所以不
能直接按照bi-ai来走,
1
5 50
1 0
1 0
1 0
1 0
50 30
要按照bi来走,
那要是遇到(例子很多啊)
貌似我又死了
所以不能单纯走bi
ai,bi,bi-ai都不能单纯走得通
肯定要变通一下,如何变通呢
ai,bi,bi-ai都不能单纯走得通
肯定要变通一下,如何变通呢
1.先吃小怪,达峰值,吃bi大的大怪
记得m要long long 因为可能疯狂吃超过了int范围,停在了%80
这个点卡了好久,加long long啊!!!
*/
`#include
代码块 #include<iostream> #include<algorithm> #include<cstring> using namespace std; struct node { long long a; long long b; }; long long t,n,m,flag; struct node x[600000]; bool cmp(struct node q,struct node w) { return (q.b-q.a)>(w.b-w.a); } bool cmm(struct node q,struct node w) { return q.b>w.b; } int main() { cin>>t; while(t--) { cin>>n>>m; for(int i=1; i<=n; i++) cin>>x[i].a>>x[i].b; flag=1; while(flag==1) { flag=0; sort(x+1,x+n+1,cmp); for(int i=1;i<=n;i++) if(x[i].a<=m&&(x[i].b-x[i].a)>=0&&(x[i].a!=0||x[i].b!=0)) { flag=1; m=m-x[i].a+x[i].b; x[i].a=0; x[i].b=0; } } sort(x+1,x+1+n,cmm); flag=0; for(int i=1;i<=n;i++) { if(m>=x[i].a) { m=m-x[i].a+x[i].b; } else { cout<<"No"<<endl; flag=1; break; } } if(flag==0) cout<<"Yes"<<endl; } return 0; } `