您的位置:首页 > 其它

[BZOJ1071][SCOI2007][堆]组队

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

[Analysis]
好吧首先说这种方法是O(n ^ 2 log n)的,不过竟然可过……
首先预处理:Height = A * height, Weight = B * weight Val = Height + Weight
然后按照Weight 排序。枚举作为minHeight 的球员。再从大到小枚举作minWeight的队员。将能够组队的队员的Val放到堆里面去。每次minWeight更新的时候将堆里面不满足限制条件的弹出。由于每一轮枚举minHeight的时候,minWeight都是递减的而minHeight不变,所以已经从堆里面弹出的是不可能在入堆的……
[code]/**************************************************************
Problem: 1071
User: gaotianyu1350
Language: C++
Result: Accepted
Time:1072 ms
Memory:1392 kb
****************************************************************/

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;

const long long MAXN = 5010;

priority_queue<int> q;

struct Node
{
long long Height, Speed, Val;
bool operator <(const Node a) const
{
return Val < a.Val;
}
}a[MAXN];

bool cmp(const Node a, const Node b)
{
return a.Speed > b.Speed;
}

long long A, B, C, n;

int main()
{
scanf("%lld%lld%lld%lld", &n, &A, &B, &C);
for (long long i = 1; i <= n; i++)
{
scanf("%lld%lld", &a[i].Height, &a[i].Speed);
a[i].Height *= A;
a[i].Speed *= B;
a[i].Val = a[i].Height + a[i].Speed;
}
sort(a + 1, a + 1 + n, cmp);
long long ans = 1;
for (long long i = 1; i <= n; i++)
{
long long minHeight = a[i].Height;
long long minSpeed = a[i].Speed;
while (!q.empty()) q.pop();
q.push(a[i].Val);
for (long long j = 1; j <= n; j++)
if (j != i && a[j].Height >= minHeight)
{
minSpeed = min(minSpeed, a[j].Speed);
if (a[i].Val > C + minHeight + minSpeed) break;
while (!q.empty() && q.top() > C + minHeight + minSpeed) q.pop();
if (a[j].Val <= C + minHeight + minSpeed)
{
q.push(a[j].Val);
ans = max(ans, (long long)q.size());
}
}
}
printf("%lld\n", ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BZOJ SCOI