題庫建設。。。
已知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此題給了乙個陣列,...