【枚举+优化】10396 - 组队

【枚举+优化】10396 - 组队

Time Limit: 1000MS
Memory Limit: 65536KB

NBA每年都有球员选秀环节。通常用速度和身高两项数据来衡量一个篮球运动员的基本素质。假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为minH,那么这支球队的所有队员都应该满足:

A * ( height – minH ) + B * ( speed – minV ) <= C

其中A和B,C为给定的经验值。这个式子很容易理解,如果一个球队的球员速度和身高差距太大,会造成配合的不协调。

请问作为球队管理层的你,在N名选秀球员中,最多能有多少名符合条件的候选球员。

输入

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

输出

最多候选球员数目。

样例
输入:
4 1 2 10
5 1
3 2
2 3
2 1
输出:
4

数据范围:

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

这题我开始一直SB

连最朴素的三重循环都写不来

我开始一直想先枚举人的个数

TMD我后来才知道枚举的时候就可以直接判断

这就是基础不好的后果 哎=。=

思路:

A * ( height – minH ) + B * ( speed – minV ) <= C
可以变形为

A * height + B * speed <= C + A * minH + B * minV

而每次枚举minH minV 是确定了的

将(A * height + B * speed)排个序

所以容易知道if(A * height + B * speed>C + A *
minH + B * minV)

所以后面的都可以不用枚举了
Source
四川省NOI2007省集训队选拔

O(n3)30分

 1 # include<cstdio>
 2 # include<cstring>
 3 # include<iostream>
 4 # include<algorithm>
 5 using namespace std;
 6 typedef long long LL;
 7 const int maxn=5000+10;
 8 LL N,A,B,C,tot,t;
 9 LL height[maxn],speed[maxn];
10 int main(){
11     t=-1;
12     ios::sync_with_stdio(false);
13     cin>>N>>A>>B>>C;
14     for(int i=1;i<=N;i++)
15     cin>>height[i]>>speed[i];
16
17     for(int i=1;i<=N;i++)
18     for(int j=1;j<=N;j++){
19     tot=0;
20     for(int k=1;k<=N;k++)
21     if(height[k]>=height[i]&&speed[k]>=speed[j]&&A*(height[k]-height[i])+B*(speed[k]-speed[j])<=C)
22     tot++;
23     t=max(t,tot);
24     }
25     cout<<t;
26     return 0;
27 }
时间: 2024-08-07 18:33:53

【枚举+优化】10396 - 组队的相关文章

简单除法(简单枚举优化)

#include<iostream> #include<algorithm> using namespace std; void panduan(int s,int k) { int n,m;bool l=1; n=s;m=k; int i,sn=0,a[20],j; for(i=0;n!=0;i++) { a[i]=n%10; n=n/10; } for(;m!=0;i++) { a[i]=m%10; m=m/10; } i--; sort(a,a+i); if(i==8) {a

2018今日头条春招的一道笔试题 —— 通过改变枚举的变量进行枚举优化

题目如下: 这道题我们最先想到的做法,应该就是2重循环枚举数对,然后把数对放在set里去重,最后输出set的大小,即输出set.size( ).代码如下: 1 #include<iostream> 2 #include<set> 3 using namespace std; 4 5 int n, k, a[100000]; 6 set<pair<int, int>> mypairs; 7 8 int main() 9 { 10 cin >> n

[hdu3486]rmq+枚举优化

题意:给n个数,求最小的段数,使得每一段的最大值之和大于给定的k.每一段的长度相等,最后若干个丢掉. 思路:从小到大枚举段数,如果能o(1)时间求出每一段的和,那么总复杂度是O(n(1+1/2+1/3+...+1/n))=O(nlogn)的.但题目时限卡得比较紧,需加一点小优化,如果连续两个段数它们每一段的个数一样,那么这次只比上次需要多计算一个区间,用上一次的加上这个区间最大值得到当前分段的总和,这样能减少不少运算量.详见代码: 1 #pragma comment(linker, "/STAC

Objective-C 高性能的循环遍历 forin - NSEnumerator - 枚举 优化

Cocoa编程的一个通常的任务是要去循环遍历一个对象的集合  (例如,一个 NSArray, NSSet 或者是 NSDictionary). 这个看似简单的问题有广泛数量的解决方案,它们中的许多不乏有对性能方面问题的细微考虑. 对于速度的追求 首先,是一个免责声明: 相比其它问题而言,一个 Objective-C 方法原始的速度是你在编程时最后才需要考虑的问题之一 – 区别就在于这个问题够不上去同其它更加需要重点考虑的问题进行比较,比如说代码的清晰度和可读性. 但速度的次要性并不妨碍我们去理解

简单的除法(简单枚举优化)

//输入一个正整数n从小到大的顺序输出都形如abcde/fghij=n在表达a至j仅仅是数字0至9置换 //进入62出口 //79546/01283=62 //94739/01528=62 //尽管是暴力求解.可是做了一些优化. #include<iostream> #include<algorithm> using namespace std; void panduan(int s,int k) { int n,m;bool l=1; n=s;m=k; int i,sn=0,a[

2017Facebook面试题改编“一面砖墙 ”—— 通过使用哈希表进行枚举优化

题目:一面砖墙 这道题改编自网上Facebook去年的一道面试题,是hihoCoder的1494题(https://hihocoder.com/problemset/problem/1494) 这道题猛一看好像没有什么思路,枚举起来感觉挺麻烦的.为了描述方便,我们在水平方向建立一个X轴,X=0的位置设成这面墙的左边缘.X轴的长度单位与砖的长度单位保持一致: 这样对于每一个砖和砖之间交界的缝隙,都有一个X坐标.比如第一层天蓝色的缝隙,X坐标就是6,深蓝色的缝隙坐标就是10:第二层红色的缝隙坐标是8

POJ - 1054 The Troublesome Frog 模拟 枚举优化。

题意:有个R*C的格网.上面有若干个点,这些点可以连成一些直线,满足:这些点在直线上均匀排布(也就是间隔相等),直线的两段穿过网格(也就是第一个,最后一个在网格的边界附近) 求某条直线上最多的点数 题解:先排序,再任取两个水稻,算出之间的dx,dy,然后就能推出前后的水稻坐标,用如果满足路径上一直有水稻(用binarysearch),且第一个点与最后一个点在水稻外面,就是一个可行的解,维护其最大值. 注意一些判断. ac代码: #include<iostream> #include<al

51nod 1548 欧姆诺姆和糖果 (制约关系优化枚举)

1548 欧姆诺姆和糖果 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 一天,欧姆诺诺姆来到了朋友家里,他发现了许多糖果.有蓝色和红色两种.他知道每颗红色糖果重Wr克,每颗蓝色糖果重Wb克.吃一颗蓝色糖果会给他带来Hb的欢乐值,吃一颗红色糖果会给他带来Hr的欢乐值. 欧姆诺姆最多只能吃C克的糖果,而且每一颗糖果不能只吃一半.现在他想通过吃蓝色和红色的糖果来获得最大的欢乐值. 样例解释:每一种糖果吃两颗即可.

DP常用优化

DP常用优化 一.前缀和优化 当遇到类似:\(f[i] = \sum_{j = k}^{i} g[j]\)的转移时,可以通过预处理出\(g[i]\)的前缀和\(s[i]\),将\(O(n)\)的求和转换为\(O(1)?\)的操作. [HAOI2009]逆序对数列 [HAOI2008]木棍分割 二分答案+dp P4099 [HEOI2013]SAO 树形dp 二.决策单调性--单调队列优化 接下来几种优化方法主要是对1d/1d dp的优化,其中xd/yd dp指的是状态数有\(n^x\)种,每个状