jzoj 3833. 平坦的折线(lam)

2023-12-25 07:30
文章标签 jzoj 折线 3833 lam 平坦

本文主要是介绍jzoj 3833. 平坦的折线(lam),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 

这篇关于jzoj 3833. 平坦的折线(lam)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/534684

相关文章

Jzoj 条件循环(while,do while) 部分代码(共25题)

1020: 【入门】编程求1+3+5+...+n #include <bits/stdc++.h>using namespace std;int n, sum;int main() {scanf("%d", &n);for(int i=1; i<=n; i+=2){sum+=i;} printf("%d", sum);return 0;} 1012: 【入门】两数比大小 #i

Jzoj 二维数组部分代码(共13题)

2788: 【入门】二维数组的输入输出 边输入边输出 #include <bits/stdc++.h>using namespace std;int n, m, a[11][11];int main(){scanf("%d %d", &n, &m);//边输入边输出for(int i=1; i<=n; ++i){for(int j=1; j<=m; ++j){scanf("%d", &

HDU2050.折线分割平面

【题意】 平面上有n条折线,问这些折线最多能将平面分割成多少块? 【思路】 递推公式:F(n)=F(n-1)+4(n-1)+1;通项公式:Zn = 2n(2n+1)/2+1-2n=2n^2–n+1 #include<stdio.h>int main(){int m,n;__int64 c;scanf("%d",&n);while(n--){scanf("%d",&m);c=2*(m*m

折线割面问题

折线割面 求n条折线分割平面的最大数目。 代码 #include<iostream>#include<cstdio>using namespace std;long long dp[20010]={0,1};int main(){int n;scanf("%d",&n);for(int i=2;i<=n*2;i++){dp[i]=dp[i-1]+i-1;}printf("%ll

Canvas 绘制坐标系中的点以及折线

需求 上一篇章介绍了如何使用Canvas绘制坐标系,那么本篇章来看看怎么简单绘制坐标系中的点。 示例图如下: 可以看到这里绘画的坐标点比较大,为了更好看一些。其实不管大小,基本的绘制步骤如下: 设置坐标点的中心圆点位置(x0,y0)设置坐标点的大小 dotSize计算坐标点的上下左右四角的点坐标 条件1和2可以直接通过设置获取,而坐标点上下左右四角坐标看看下面的计算

折线统计图 初级

此为折线统计图的初级题目。 本次的题目较难,菜鸡请退出。 4. 下图显示了甲、乙两台电脑的价格以及它们已使用的年数,从图中可以知道( )。   15. 妈妈去菜市场买菜,走到半路遇到一位熟人聊了一会儿,突然发现忘了带钱。于是马上回家拿钱,然后开着电瓶车重新去

pyecharts 画折线图去掉折线上小圆圈

如果想删除上图标记出来的小圆圈,变为如下形式: 只需在代码中加入 is_symbol_show = False 即可: line.add(country,date_column, _dict[country],line_width = 3,is_symbol_show = False,xaxis_rotate = 30,width=10000,xaxis_interval= 3) 以上,问

【源码】html+JS实现:24小时折线进度图

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>24小时折线进度图</title> <style> body { margin: 0;

如何用MFC画出直线、虚线、折线、圆、椭圆、矩形、弧形(附上源码)

我创建的工程名字是默认的,叫MFCApplication3 首先在MFCApplication3Dlg.h这个文件中添加构造说明: public:CPen m_pen[5];CPoint m_point[5];public:void DrawLine(CDC *pDC);void DrawPolyline(CDC *pDC);void DrawPolygon(CDC *pDC);void

使用matplotlib绘制折线条形复合图

使用matplotlib绘制折线条形复合图 介绍效果代码 介绍 在数据可视化中,复合图形是一种非常有用的工具,可以同时显示多种数据类型的关系。在本篇博客中,我们将探讨如何使用 matplotlib 库来绘制包含折线图和条形图的复合图。 效果 代码 import matplotlib.pyplot as pltimport numpy as np# 示例数据categ