覆蓋最多的直線上的點

2021-07-11 15:07:05 字數 1643 閱讀 1107

題庫建設。。。

已知x1,x2,x3,…,xn是直線上的點,現希望用固定長度固定數量的木條去覆蓋這些點,請編寫程式求最多能夠覆蓋多少點?

輸入要求:輸入的第1行為三個整數n,m,k,分別表示直線上點的個數,木條的長度以及數量。輸入的第2行有n個整數,表示座標上的點。

輸出要求:輸出1行,為最多能夠覆蓋的點的個數。

輸入樣例:

8 3 2

10 7 6 1 -5 4 18 20

#include 

#include

using

namespace

std;

//用於存放線段的結構體

struct node ;

node *node;

int getmaxovernum(int*point, int n, int m, int k);

int getnode(int*point, int begin, int end, int m);

bool comp(node a,node b)

int main()

//從小到大排序

sort(point, point + n);

cout

<< getmaxovernum(point, n, m, k) << endl;

deletepoint;

deletenode;

return0;}

int getmaxovernum(int*point, int n, int m, int k)

int num = getnode(point,0,n,m);

if (0 == num )

sort(node, node + num,comp);//從大到小排序

cout

<< endl << "符合條件的線段:"

<< endl << "起始點 終點 數量"

<< endl;;

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

int i = 1;

int pre = 0;//用於比較的前乙個索引

int max = node[0].count;

k--;//上面用掉一根木塊了

cout

<< endl << "選出來的線段:"

<< endl;

cout

<< node[0].begin << " "

<< node[0].end << " "

<< node[0].count << endl;//測試**

while (k > 0 && i < num)

i++;

}if (k > 0)

return max;

}int getnode(int*point, int begin, int end, int m)

else }}

else

i++;

}return num;

}

執行示例:

149 直線上最多的點數

思路 先用map將輸入的點去重 這裡要自定義比較函式 然後對於每乙個點,遍歷其後面的每乙個點,記錄在一條直線上的點的數目,在記錄的過程中維護最大值。開始時在map的自定義比較函式上面卡了殼,為此還得到codeblock這種ide除錯才看的出來,用vs的話比較函式少了const照樣能執行 defini...

LeetCode 149 直線上最多的點數

給定乙個二維平面,平面上有 n 個點,求最多有多少個點在同一條直線上。思路 兩點可以確定一條直線,那麼選擇固定乙個點,求其他點與固定點的斜率,如果斜率相同,那麼斜率相同的點在同一條直線上。注意點 1.儲存斜率可以使用雜湊表進行 2.測試資料中精度要求很高,使用double進行計算會出現錯誤,可以選擇...

LeetCode 149 直線上最多的點數

給定乙個二維平面,平面上有 n 個點,求最多有多少個點在同一條直線上。示例 1 輸入 1,1 2,2 3,3 輸出 3解釋 o o o 0 1 2 3 4示例 2 輸入 1,1 3,2 5,3 4,1 2,3 1,4 輸出 4解釋 o o o o o o 0 1 2 3 4 5 6此題給了乙個陣列,...