日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

一条直线上N个线段所覆盖的总长度

發(fā)布時(shí)間:2023/11/27 生活经验 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一条直线上N个线段所覆盖的总长度 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)自http://blog.csdn.net/bxyill/article/details/8962832

問題描述:

現(xiàn)有一直線,從原點(diǎn)到無窮大。

這條直線上有N個(gè)線段。線段可能相交。

問,N個(gè)線段總共覆蓋了多長?(重復(fù)覆蓋的地區(qū)只計(jì)算一次)

================================================

解題思路:

可以將每個(gè)線段拆分成“單位1”

遍歷所有線段,使用一個(gè)數(shù)組記錄每個(gè)線段所走過的“單位1”

最后統(tǒng)計(jì)數(shù)組中被走過的中“單位1”的個(gè)數(shù),即是所有線段覆蓋的總長度了。

這里有個(gè)問題?數(shù)組的大小如何確定?

數(shù)組的大小應(yīng)該是所有線段中最大的端點(diǎn)坐標(biāo)。

?===============================================

順便想到一個(gè)問題。

給出若干個(gè)線段。求一共有幾個(gè)“連通域”。就是將能合并的線段 合并成一個(gè)線段。

最后能合并出幾個(gè)來?

利用上面的思想。非常簡單。

只需遍歷單位數(shù)組的時(shí)候做個(gè)開始和結(jié)尾的記錄就行了。

程序?qū)崿F(xiàn)如下。

===============================================

//此題要求
//求出一條直線上所有線段所覆蓋的全程長度是多少。
//重疊的地方只計(jì)算一次。
//================================
//本算法的思想是,將每個(gè)線段進(jìn)行像素化,
//添加到一個(gè)單位數(shù)組c[N]中
//遍歷c數(shù)組判斷哪些單位被覆蓋到了,
//在count計(jì)數(shù)一下就知道一共覆蓋了多少路程。
//真是巧妙啊。
//==============================
#include <iostream>
using namespace std;
const int N = 10000;
//線段結(jié)構(gòu)體
struct Segment
{int start;int end;
};
//
int coverage(Segment *segments, int n)
{bool c[N]={false};//每個(gè)“單位1”是否被覆蓋到int start=0;int end = 0;//遍歷n個(gè)線段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;}}//從最左端開始到最右端。遍歷單位數(shù)組Cint 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;
}

?

輸出結(jié)果如下:

歸并后
[1,6]
[10,13]

被覆蓋總長度
8

請按任意鍵繼續(xù). . .

轉(zhuǎn)載于:https://www.cnblogs.com/bethunebtj/articles/4884893.html

總結(jié)

以上是生活随笔為你收集整理的一条直线上N个线段所覆盖的总长度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。