原文:
問題描述:
現有一直線,從原點到無窮大。
這條直線上有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...