NOIP模拟 NYG的背包 [高山算法]

来源:互联网 发布:菜鸟网络 工作强度 编辑:程序博客网 时间:2024/04/30 05:52

终于我的贪心过了,方法与题解不同,我每次记录历史最高值h,若当前x<=h则可以,然后判定几个特殊条件,AC了。

高山算法是什么?自行百度,本人无厘头命名,貌似是时间空间最优的方法。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N = 100005;struct data{    long long x,y;    bool operator < (const data &rhs)const{        return x<rhs.x||(x==rhs.x&&(y-x)>(rhs.y-rhs.x));    }}a[N];inline void read(long long &res){    static char ch;long long flag=1;    while((ch=getchar())<'0'||ch>'9')if(ch=='-')flag=-1;res=ch-48;    while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-48;res*=flag;}long long t,n,w,h,flag,b;int main(){    freopen("backpack.in","r",stdin);    freopen("backpack.out","w",stdout);    read(t);    while(t--){        read(n),read(w);h=w;        for(register int i=1;i<=n;i++)read(a[i].x),read(a[i].y);        sort(a+1,a+1+n),flag=1;b=0x3f3f3f3f;        for(register int i=1;i<=n;i++){            if(h<a[i].x){cout<<"No"<<endl;flag=0;break;}            w-=a[i].x;w+=a[i].y;            h=max(h,w);b=min(b,a[i].y);        }        if(flag){            if(w<b)cout<<"No"<<endl;            else cout<<"Yes"<<endl;        }    }    return 0;}

这里写图片描述

原创粉丝点击