一条直线上N个线段所覆盖的总长度
时间:2022-05-04
本文章向大家介绍一条直线上N个线段所覆盖的总长度,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
转自http://blog.csdn.net/bxyill/article/details/8962832
问题描述:
现有一直线,从原点到无穷大。
这条直线上有N个线段。线段可能相交。
问,N个线段总共覆盖了多长?(重复覆盖的地区只计算一次)
================================================
解题思路:
可以将每个线段拆分成“单位1”
遍历所有线段,使用一个数组记录每个线段所走过的“单位1”
最后统计数组中被走过的中“单位1”的个数,即是所有线段覆盖的总长度了。
这里有个问题?数组的大小如何确定?
数组的大小应该是所有线段中最大的端点坐标。
===============================================
顺便想到一个问题。
给出若干个线段。求一共有几个“连通域”。就是将能合并的线段 合并成一个线段。
最后能合并出几个来?
利用上面的思想。非常简单。
只需遍历单位数组的时候做个开始和结尾的记录就行了。
程序实现如下。
===============================================
//此题要求
//求出一条直线上所有线段所覆盖的全程长度是多少。
//重叠的地方只计算一次。
//================================
//本算法的思想是,将每个线段进行像素化,
//添加到一个单位数组c[N]中
//遍历c数组判断哪些单位被覆盖到了,
//在count计数一下就知道一共覆盖了多少路程。
//真是巧妙啊。
//==============================
#include <iostream>
using namespace std;
const int N = 10000;
//线段结构体
struct Segment
{
int start;
int end;
};
//
int coverage(Segment *segments, int n)
{
bool c[N]={false};//每个“单位1”是否被覆盖到
int start=0;
int end = 0;
//遍历n个线段
for(int i = 0; i < n; i++)
{
for(int j = segments[i].start; j < segments[i].end; j++)
{
c[j] = true;
}
//寻找最右端
if(segments[i].end > end)
{
end = segments[i].end;
}
//寻找最左端
if(segments[i].start < start)
{
start = segments[i].start;
}
}
//从最左端开始到最右端。遍历单位数组C
int count = 0;
for(int i= start; i < end; i++)
{
if(c[i])
{
int s=i;
while(c[i])
{
count++;
i++;
}
int e=i;
cout << "["<<s<<","<<e<<"]"<<endl;
}
}
return count;
};
int main()
{
Segment s1;
s1.start = 1;
s1.end = 3;
Segment s2;
s2.start = 2;
s2.end = 6;
Segment s3;
s3.start = 11;
s3.end = 12;
Segment s4;
s4.start = 10;
s4.end = 13;
Segment ss[] = {s1,s2,s3,s4};
cout << "归并后"<<endl;
cout <<"被覆盖总长度:" <<coverage(ss, sizeof(ss)/sizeof(ss[0]))<<endl;
}
输出结果如下:
归并后 [1,6] [10,13]
被覆盖总长度 8
请按任意键继续. . .
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SVN提交时强制用户写日志
- Apache vhost配置
- win10使用WSL 2运行Docker Desktop,运行文件从C盘迁移到其他目录
- htaccess简介和16个小技巧
- Nginx禁止指定目录运行PHP脚本
- 机器学习数学笔记|偏度与峰度及其 python 实现
- ABP(ASP.NET Boilerplate Project)快速入门
- IdentityServer4 4.x版本 配置Scope的正确姿势
- 个人总结的部分数据验证规则
- 一句话实现php日期转中文汉字
- .Net Core微服务入门全纪录(八)——Docker Compose与容器网络
- PHP中少用但是很好用的方法
- 使用一维数据构造简单卷积神经网络
- .Net Core微服务入门全纪录(完结)——Ocelot与Swagger
- PHP使用GD库生成文件