NC20257. [SCOI2007]组队
描述
输入描述
第一行四个数N、A、B、C 下接N行每行两个数描述一个球员的height和speed
输出描述
最多候选球员数目。
示例1
输入:
4 1 2 10 5 1 3 2 2 3 2 1
输出:
4
C++14(g++5.4) 解法, 执行用时: 356ms, 内存消耗: 508K, 提交时间: 2020-10-07 13:17:26
#include<bits/stdc++.h> using namespace std; int a,b,c,n,m,ans; struct node { int h,v,s; }a1[5200],a2[5200],a3[5200]; bool cmp1(node x,node y) { return x.h<y.h; } bool cmp2(node x,node y) { return x.v<y.v; } bool cmp3(node x,node y) { return x.s<y.s; } int main() { scanf("%d%d%d%d",&n,&a,&b,&c); for(int i=1;i<=n;i++) { scanf("%d%d",&a1[i].h,&a1[i].v); a1[i].s=a*a1[i].h+b*a1[i].v; a3[i]=a2[i]=a1[i]; } sort(a2+1,a2+n+1,cmp2); sort(a3+1,a3+n+1,cmp3); for(int i=1;i<=n;i++) { int l1=0,l2=0,cnt=0,minn=a1[i].h,maxx=a1[i].h+c/a; for(int j=1;j<=n;j++) { while(l2<n&&a3[l2+1].s<=c+a*a1[i].h+b*a2[j].v) ++l2,cnt+=(a3[l2].h>=minn&&a3[l2].h<=maxx); while(l1<n&&a2[l1+1].v<a2[j].v) ++l1,cnt-=(a2[l1].h>=minn&&a2[l1].h<=maxx); ans=max(ans,cnt); } } cout<<ans<<endl; return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 370ms, 内存消耗: 608K, 提交时间: 2020-03-08 23:02:21
#include<bits/stdc++.h> using namespace std; int a,b,c,n,m,ans; struct node { int h,v,s; }a1[5200],a2[5200],a3[5200]; bool cmp1(node x,node y) { return x.h<y.h; } bool cmp2(node x,node y) { return x.v<y.v; } bool cmp3(node x,node y) { return x.s<y.s; } int main() { scanf("%d%d%d%d",&n,&a,&b,&c); for(int i=1;i<=n;i++) { scanf("%d%d",&a1[i].h,&a1[i].v); a1[i].s=a*a1[i].h+b*a1[i].v; a3[i]=a2[i]=a1[i]; } sort(a2+1,a2+n+1,cmp2); sort(a3+1,a3+n+1,cmp3); for(int i=1;i<=n;i++) { int l1=0,l2=0,cnt=0,minn=a1[i].h,maxx=a1[i].h+c/a; for(int j=1;j<=n;j++) { while(l2<n&&a3[l2+1].s<=c+a*a1[i].h+b*a2[j].v) ++l2,cnt+=(a3[l2].h>=minn&&a3[l2].h<=maxx); while(l1<n&&a2[l1+1].v<a2[j].v) ++l1,cnt-=(a2[l1].h>=minn&&a2[l1].h<=maxx); ans=max(ans,cnt); } } cout<<ans<<endl; return 0; }