传送门:BZOJ1071
枚举minH,minV,单调性优化+计不可行方案数即可。
代码上的细节较多。
代码上的小细节见下。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 5050
using 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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-05 16:00:15