Description
现在我们在一张纸上有一个笛卡尔坐标系。我们考虑在这张纸上用铅笔从左到右画的折线。我们要求任何两个点之间连接的直线段与x轴的夹角在-45~45之间,一条满足以上条件的折线称之为平坦的折线。假定给出了n个不同的整点(坐标为整数的点),最少用几条平坦的折线可以覆盖所有的点?
例子:
图中有6个整点:(1,6), (10,8), (1,5), (2,20), (4,4), (6,2),要覆盖它们至少要3条平坦的折线。
任务:
写一个程序:
从文件lam.in中读入点的个数以及它们的坐标。
计算最少需要的折线个数。
将结果写入文件lam.out。
Input
在输入文件lam.in的第一行有一个正整数n,不超过30000,代表点的个数。接下来的n行表示这些点的坐标,每行有两个用一个空格隔开的整数x,y,0 <= x <= 30000, 0 <= y <= 30000。第i+1行的数字代表第i个点的坐标。
Output
在输出文件lam.out的第一行应当有且仅有一个整数——表示覆盖所有的点最少需要的折线数。
Sample Input
6
1 6
10 8
1 5
2 20
4 4
6 2
Sample Output
3
Data Constraint
数据规模
对于20%的数据,有N<=15。
对于100%的数据如题目。
求最少要几个与x轴的夹角在-45~45度的折线,覆盖所有的点。
与x轴的夹角在-45~45度这个条件很难处理,考虑将其逆时针转45度,x’=x-y,y’=x+y
这样条件变成只要使线段不下降(斜率大于0)就行了,
将新的坐标按x为第一关键字,y为第二从小到大排序,
条件又变成只用使y坐标不下降
问题就变成同导弹拦截(NOIP1999)一样,求用多少个不下降序列覆盖完所有点
答案即为最长下降序列的长度(因为最长下降序列的每个点都可以做一个不下降序列的起点)
#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 30005
#define Max 9999999997
using
本文发布于:2024-02-01 11:24:26,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170675786936260.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |