列表

详情


NC20257. [SCOI2007]组队

描述

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

输入描述

第一行四个数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;
}

上一题