Racing Gems

 

You are playing a racing game.  Your character starts at the x axis (y = 0) and proceeds up the      race track, which has a boundary at the line x = 0 and another at x = w.  You  may start the race       at any horizontal position you want, as long as it is within the track boundary.  The finish line is       at y = h, and the game ends when you reach that line.  You proceed at a fixed vertical velocity v,   but you can control your horizontal velocity to be any value between v/r and v/r, and change it     at any time.

There are n gems at specific points on the race track.  Your  job is to collect as many gems as  possible.  How many gems can you collect?

Input

The first line of input contains four space-separated integers n, r, w, and h (1 n 105, 1 r 10,  1 w, h 109). Each of the following  n lines  contains  two  space-separated  integers  xand  yi, denoting the coordinate of the ith gem (0 xi w, 0 < yi h).  There will be at most one gem        per location.

The input does not include a value for    v.

Output

Print, on a single line, the maximum number of gems that can be collected during the  race.

Sample Input

Sample Output

3

5  1  10 10

8 8

5 1

4 6

4 7

7 9

Sample Input

Sample Output

3

5  1  100 100

27 75

79 77

40 93

62 41

52 45

Sample Input

Sample Output

4

10  3  30 30

14 9

2 20

3 23

15 19

13 5

17 24

6 16

21 5

14 10

3 6

/*/
题意,跑跑车游戏,x方向速度为1,y方向自己控制范围在-1/r到1/r之间。 给出金币的坐标,最多问能捡到多少金币。 首先可以知道,我们的可以走的范围为由出发点引出的左右两条射线之内,如果下一个点在现在的点的射线范围内,那么这个金币可以被捡到。 如果没有在射线范围内,就无法被捡到 上图

可以从图中看到下面第一个绿色的点A可以直接走到的点有两个 B 和C,但是B只能再走向E,而C可以走到D,再从D走到E;

明显A-C-D-E这种路径长些,想到这里,我们可以这样去解决这个问题:

把每个点的坐标按照左右位移的速度 1/r 映射到左右两个边界,按照左右两个边界升序排序【左边界优先】,取右边界最大上升子序列就行了。

这里用到了一个迭代器upper_bound(a,a+n,x),它的作用是返回a数组中从x开始的递增序列的最后一个的地址。

AC代码:
/*/
#include"algorithm"
#include"iostream"
#include"cstring"
#include"cstdlib"
#include"cstdio"
#include"string"
#include"vector"
#include"queue"
#include"cmath"
using namespace std;
typedef long long LL ;
#define memset(x,y) memset(x,y,sizeof(x))
#define memcpy(x,y) memcpy(x,y,sizeof(x))
#define FK(x) cout<<"["<<x<<"]\n"
#define bigfor(x) for(LL qq=1;qq<= T ;qq++) const LL MX=1e5+5; struct Node {
LL x,y;
bool operator<(const Node &A)const {
return x < A.x;
}
void add(LL r,LL w,LL xx,LL yy) {
x=xx*r+yy;
y=(w-xx)*r+yy;
}
} nd[MX]; LL dp[MX]; int main() {
LL n,r,w,h,x,y;
while(~scanf("%I64d%I64d%I64d%I64d",&n,&r,&w,&h)) {
for(LL i=1; i<=n; i++) {
scanf("%I64d%I64d",&x,&y);
nd[i].add(r,w,x,y);
}
LL ans=0;
memset(dp,0x3f);
sort(nd+1,nd+1+n);
for(LL i=1; i<=n; i++) {
LL tem=upper_bound(dp+1,dp+1+n,nd[i].y)-&dp[0]; //★
ans = max(ans,tem);
dp[tem]=nd[i].y;
}
printf("%I64d",ans);
}
return 0;
} /*/
★升序排列的容器:
iterator lower_bound( const key_type &key ): 返回一个迭代器[地址],指向键值>= key的第一个元素。
iterator upper_bound( const key_type &key ):返回一个迭代器[地址],指向键值<=key的最后一个元素的后一个元素。
★降序排列的容器:
iterator lower_bound( const key_type &key ): 返回一个迭代器[地址],指向键值<= key的第一个元素。
iterator upper_bound( const key_type &key ):返回一个迭代器[地址],指向键值>=key的最后一个元素的后一个元素。
/*/

  

 

ACM: Racing Gems - 最长递增序列的更多相关文章

  1. POJ 2533 Longest Ordered Subsequence 最长递增序列

      Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequenc ...

  2. uva103(最长递增序列,dag上的最长路)

    题目的意思是给定k个盒子,每个盒子的维度有n dimension 问最多有多少个盒子能够依次嵌套 但是这个嵌套的规则有点特殊,两个盒子,D = (d1,d2,...dn) ,E = (e1,e2... ...

  3. [LeetCode] Number of Longest Increasing Subsequence 最长递增序列的个数

    Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: I ...

  4. Leetcode 674.最长递增序列

    最长递增序列 给定一个未经排序的整数数组,找到最长且连续的的递增序列. 示例 1: 输入: [1,3,5,4,7] 输出: 3 解释: 最长连续递增序列是 [1,3,5], 长度为3. 尽管 [1,3 ...

  5. [LeetCode] 673. Number of Longest Increasing Subsequence 最长递增序列的个数

    Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: I ...

  6. XHXJ's LIS HDU - 4352 最长递增序列&数位dp

    代码+题解: 1 //题意: 2 //输出在区间[li,ri]中有多少个数是满足这个要求的:这个数的最长递增序列长度等于k 3 //注意是最长序列,可不是子串.子序列是不用紧挨着的 4 // 5 // ...

  7. LeetCode OJ:Longest Increasing Subsequence(最长递增序列)

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...

  8. [leetcode]最长递增序列

    class Solution { public: int lengthOfLIS(vector<int>& nums) { int n=nums.size(); ) ; vecto ...

  9. 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列

    出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...

随机推荐

  1. CSS3–2.css3 响应式布局

    1.响应式布局 响应式布局是现在很流行的一个设计理念,随着移动互联网的盛行,为解决如今各式各样的浏览器分辨率以及不同移动设备的显示效果,设计师提出了响应式布局的设计方案.所谓的响应式布局,就是一个网站 ...

  2. Oracle数据库备份与还原操作具体步骤

    Oracle数据库导出操作 导入导出都要进行目录创建与授权. 在pl/sql里面编写也可以 select * from dba_directories(这个是查看创建的目录) drop directo ...

  3. Linux常用的日志分析命令与工具

    >>基础命令 操作 命令 说明 查看文件的内容 cat -n access.log -n显示行号 分页显示文件 more access.log Enter下一行,空格下一页,F下一屏,B上 ...

  4. HTTPCLIENT 学习 (1) 入门

    早就如雷贯耳它的大名,却一直不曾相见,昨天下载下来,今天终于测试了一把,用的官网的QUICK START例子,来访问我自己以前开发过的WEB程序,因为这个网站恰好有一个写好的通过POST请求验证用户名 ...

  5. org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance:

    详细错误堆栈信息: org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" ...

  6. RMAN恢复目录

    是否使用RMAN恢复目录(Recovery Catalog 你可能从其他人或书上听过RMAN恢复目录(也有可能是其他名字,RMAN Recovery Catalog的翻译较多较杂,以下简称恢复目录), ...

  7. poj 2337 欧拉回路输出最小字典序路径 ***

    把26个小写字母当成点,每个单词就是一条边. 然后就是求欧拉路径. #include<cstdio> #include<iostream> #include<algori ...

  8. barabasilab-networkScience学习笔记2-图理论

    第一次接触复杂性科学是在一本叫think complexity的书上,Allen博士很好的讲述了数据结构与复杂性科学,barabasi是一个知名的复杂性网络科学家,barabasilab则是他所主导的 ...

  9. 如何安装Ecshop for linux

    下载 http://update.shopex.com.cn/version/program/ECShop/download_ecshop_utf8.php 解压缩之后把upload文件夹中的内容放到 ...

  10. 如何修改 SQL Server 代理主作业 (Transact-SQL)

    本主题介绍了如何使用存储过程修改 Microsoft SQL Server 代理主作业. 更改作业定义计划的详细信息 1.       执行 sp_update_schedule. 在作业中添加.更改 ...