BZOJ 1071 [SCOI2007]组队
1071: [SCOI2007]组队
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 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
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 }