BZOJ1071

来源:互联网 发布:cal Linux 编辑:程序博客网 时间:2024/05/17 04:26

传送门:BZOJ1071

枚举minH,minV,单调性优化+计不可行方案数即可。
代码上的细节较多。

代码上的小细节见下。

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define N 5050using namespace std;int A,B,C;struct KSD{    int h,v;    long long s;    void keep(){        s=A*h+B*v;    }};KSD x[5005],y[5005],z[5005],r[5005];int n;int ans;bool cmph(KSD a,KSD b){    return a.h<b.h;}bool cmpv(KSD a,KSD b){    return a.v<b.v;}bool cmps(KSD a,KSD b){    return a.s<b.s;}void Solve(){    sort(x,x+n,cmph);    sort(y,y+n,cmpv);    sort(z,z+n,cmps);    for(int i=0;i<n;i++){        int pos=0,p=0,cnt=0;        for(int j=0;j<n;j++)            if(x[i].h<=y[j].h&&x[i].v>=y[j].v)                r[pos++]=y[j];        for(int j=0;j<pos;j++){            long long res=A*x[i].h+B*r[j].v+C;            while(p<n&&z[p].s<=res){                if(z[p].v<r[j].v||z[p].h<x[i].h)                    cnt++;                p++;            }            ans=max(ans,p-cnt);            if(A*r[j].h+B*r[j].v<=res)                cnt++;  //在51行中不会被检出,但下一次循环应舍弃。        }    }    printf("%d\n",ans);}void Readdata(){    freopen("loli.in","r",stdin);    scanf("%d%d%d%d",&n,&A,&B,&C);    for(int i=0;i<n;i++){        scanf("%d%d",&x[i].h,&x[i].v);        x[i].keep();        z[i]=y[i]=x[i];    }}void Close(){    fclose(stdin);    fclose(stdout);}int main(){    Readdata();    Solve();    Close();    return 0;}
0 0
原创粉丝点击