[TJOI2013]拯救小矮人 nlogn贪心Hack征集

[TJOI2013]拯救小矮人 nlogn贪心Hack征集

考试的时候忘记了DP,乱搞了一个贪心。DP是枚举每一个人选或不选,而贪心是先排序,然后能走就走,不能走就找一个(已经走了的或当前这个)最大的垫在下面。详细见代码。求一组hack数据,已经和正解大数据小数据拍了过百万组,和机房大佬手动思考hack无果。如果大家有想法可以下方讨论提出,谢谢。


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define ll long long
#define db double
#define rg register int

using namespace std;

int n,m,ans;
int s[200005];
bool f[200005];
priority_queue q;

struct su{
    int x,y,v,id;
    inline bool operator <(const su &i)const{
        if(v==i.v)return y=1;--i)s[i]=s[i+1]+a[i].x; //求后缀和
    rg res=0; ll v=0;
    for(rg i=1;i<=n;++i){
        if(s[i]+a[i].y+v>=m)q.push(a[i].x),++res; //能走就走,并将身高加入队列中记录最大值
        else{
            ans=max(res,ans); //不能走就找一个最大的身高,垫在下面(如下文的if)
            if(!q.empty()&&a[i].x=m)v+=q.top(),q.pop(),q.push(a[i].x);
            else v+=a[i].x;
        }ans=max(res,ans);
    }
    printf("%d\n",ans);
    return 0;
}

你可能感兴趣的:([TJOI2013]拯救小矮人 nlogn贪心Hack征集)