一條直線上N個線段所覆蓋的總長度

2022-04-23 05:29:25 字數 1529 閱讀 5510

原文:

問題描述:

現有一直線,從原點到無窮大。

這條直線上有n個線段。線段可能相交。

問,n個線段總共覆蓋了多長?(重複覆蓋的地區只計算一次)

解題思路:

可以將每個線段拆分成「單位1」

遍歷所有線段,使用乙個陣列記錄每個線段所走過的「單位1」

最後統計陣列中被走過的中「單位1」的個數,即是所有線段覆蓋的總長度了。

這裡有個問題?陣列的大小如何確定?

陣列的大小應該是所有線段中最大的端點座標。

順便想到乙個問題。

給出若干個線段。求一共有幾個「連通域」。就是將能合併的線段 合併成乙個線段。

最後能合併出幾個來?

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

只需遍歷單位陣列的時候做個開始和結尾的記錄就行了。

程式實現如下。

[cpp]view plain

copy

//此題要求  

//求出一條直線上所有線段所覆蓋的全程長度是多少。  

//重疊的地方只計算一次。  

//******************************==  

//本演算法的思想是,將每個線段進行畫素化,  

//新增到乙個單位陣列c[n]中  

//遍歷c陣列判斷哪些單位被覆蓋到了,  

//在count計數一下就知道一共覆蓋了多少路程。  

//真是巧妙啊。  

//******************************  

#include 

using namespace std;  

const int n = 10000;  

//線段結構體  

struct segment  

;  //  

int coverage(segment *segments, int n)  

;//每個「單位1」是否被覆蓋到  

int start=0;  

int end = 0;  

//遍歷n個線段  

for(int i = 0; i < n; i++)  

//尋找最右端  

if(segments[i].end > end)  

//尋找最左端  

if(segments[i].start < start)  

}  //從最左端開始到最右端。遍歷單位陣列c  

int count = 0;  

for(int i= start; i < end; i++)  

int e=i;  

cout << "["<","<"]"<

}  }  

return count;  

};  

int main()  

;  cout << "歸併後"<

cout <<"被覆蓋總長度:" }  輸出結果如下:

歸併後[1,6]

[10,13]

被覆蓋總長度

8請按任意鍵繼續. . .

最多有多少個點在一條直線上

題目 給出二維平面上的n個點,求最多有多少點在同一條直線上。例子 給出4個點 1,2 3,6 0,0 1,3 一條直線上的點最多有3個。方法 取定乙個點points i 遍歷其他所有節點,然後統計斜率相同的點數 用map float,int 記錄斜率及其對應點數,取map中點數最多的斜率 並求取最大...

最多有多少個點在一條直線上 LintCode

給出二維平面上的n個點,求最多有多少點在同一條直線上。樣例 給出4個點 1,2 3,6 0,0 1,3 一條直線上的點最多有3個。思想 利用map ifndef c186 h define c186 h include include include include using namespace ...

186 最多有多少個點在一條直線上

186.最多有多少個點在一條直線上 給出二維平面上的n個點,求最多有多少點在同一條直線上。樣例樣例 1 輸入 1,2 3,6 0,0 1,3 輸出 3 樣例 2 輸入 1,2 2,3 3,2 輸出 2 注意事項 x點和y點的座標值在 1000 1000之間 int findmax vector kv...