选美
题目描述
【题目描述】
一年一度的星哥选美又拉开了帷幕
N个人报名参加选拔,每个人都有着各自的相貌参数和身材参数(不大于 10000 的正整数)。你的任务是尽可能让更多人被星哥选中,而唯一要求就是,在这只队伍里面的每个人,都需满足以下不等式:
A (H− h) +B(W− w) ≤ C
其中H和W为这个人的相貌和身材, h和w为选中者中的最小相貌参数和最小身材参数,而A、 B、 C为三个不大于10000 的正的整型常数。
现在请计算星哥最多可以选中多少人。
【输入格式】
第一行:一个整数: N(0<N<=2000)
第二行:三个分开的整数: A,B和C
第三行到第N+ 2行:每行有两个用空格分开的整数,分别表示一个人的相貌参数和身材参数
【输出格式】
第一行:最多被选的人数
【输入样例】
8
1 2 4
5 1
3 2
2 3
2 1
7 2
6 4
5 1
4 3
【输出样例】
5
数据范围比较小,暴力卡过去没问题,AH+BW<=C+Ah+Bw,g=AH+BW,先对g排序,枚举h,w,然后枚举1-n,判断是否符合条件,当g>C+Ah+Bw break;
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 2005 using namespace std; int n,A,B,C,Max; int hh[maxn],ww[maxn]; struct node { int g,h,w; }a[maxn]; int g[maxn]; int comp_(const node &a,const node &b){ return a.g<b.g; } int main() { //freopen("beauty.in","r",stdin); // freopen("beauty.out","w",stdout); //freopen("in.txt","r",stdin); scanf("%d%d%d%d",&n,&A,&B,&C); for(int i=1;i<=n;i++){ scanf("%d%d",&a[i].h,&a[i].w); a[i].g=a[i].h*A+a[i].w*B; hh[i]=a[i].h;ww[i]=a[i].w; } sort(a+1,a+n+1,comp_); int minh,minw,op=0; int ans=0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(hh[j]>=hh[i]&&ww[i]>=ww[j]){ op=0; minh=hh[i];minw=ww[j]; Max=C+minh*A+minw*B; for(int k=1;k<=n;k++) if(a[k].g>Max) break; else if(a[k].w>=minw&&a[k].h>=minh) op++; ans=max(ans,op); } printf("%d",ans); //while(1); return 0; }