BZOJ 1071 [SCOI2007]组队

1071: [SCOI2007]组队

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 1330  Solved: 417
[Submit][Status][Discuss]

Description

NBA每年都有球员选秀环节。通常用速度和身高两项数据来衡量一个篮球运动员的基本素质。假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为minH,那么这支球队的所有队员都应该满足: A * ( height – minH ) + B * ( speed – minV ) <= C 其中A和B,C为给定的经验值。这个式子很容易理解,如果一个球队的球员速度和身高差距太大,会造成配合的不协调。 请问作为球队管理层的你,在N名选秀球员中,最多能有多少名符合条件的候选球员。

Input

第一行四个数N、A、B、C 下接N行每行两个数描述一个球员的height和speed

Output

最多候选球员数目。

Sample Input

4 1 2 10
5 1
3 2
2 3
2 1

Sample Output

4

HINT

 

数据范围: N <= 5000 ,height和speed不大于10000。A、B、C在长整型以内。

 

Source

题解:这是一个乱搞的题,泥萌去围观大爷的题解吧= =

反正复杂度对了就行。。。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<stack>
 6 #include<queue>
 7 #include<cstring>
 8 #define PAU putchar(' ')
 9 #define ENT putchar('\n')
10 #define MSE(a,b) memset(a,b,sizeof(a))
11 #define REN(x) for(ted*e=fch[x];e;e=e->nxt)
12 #define TIL(x) for(int i=1;i<=x;i++)
13 #define ALL(x) for(int j=1;j<=x;j++)
14 using namespace std;
15 const int maxn=5000+10;
16 double mx,mi;int l,r,cnt,ans,n,A,B,C;
17 struct data{int h,v,s;void update(){s=A*h+B*v;}}arr[2][maxn];
18 inline bool cmph(const data&a,const data&b){return a.h<b.h;}
19 inline bool cmps(const data&a,const data&b){return a.s<b.s;}
20 inline bool check(int id,int d){return arr[id][d].v<=mx&&arr[id][d].v>=mi;}
21 inline int read(){
22     int x=0;bool sig=true;char ch=getchar();
23     for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=false;
24     for(;isdigit(ch);ch=getchar())x=10*x+ch-'0';return sig?x:-x;
25 }
26 inline void write(int x){
27     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
28     int len=0;static int buf[20];while(x)buf[len++]=x%10,x/=10;
29     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
30 }
31 int main(){
32     n=read();A=read();B=read();C=read();
33     TIL(n){arr[0][i].h=read();arr[0][i].v=read();arr[0][i].update(),arr[1][i]=arr[0][i];}
34     sort(arr[0]+1,arr[0]+n+1,cmph);sort(arr[1]+1,arr[1]+n+1,cmps);
35     TIL(n){
36         mi=arr[0][i].v,mx=mi+(double)C/(double)B;l=r=cnt=0;
37         ALL(n){
38             while(r<n&&arr[1][r+1].s-A*arr[0][j].h-B*arr[0][i].v<=C)cnt+=check(1,++r);
39             while(l<n&&arr[0][l+1].h<arr[0][j].h)cnt-=check(0,++l);ans=max(ans,cnt);
40         }
41     }write(ans);
42     return 0;
43 }

 

posted @ 2015-08-20 11:04  AI_Believer  阅读(390)  评论(0编辑  收藏  举报