布展(show) 時間限制: 1 Sec 內存限制: 128 MB
題目描述
有N顆寶石, 安排在一個展示櫃展覽。 爲了展出的視覺效果, 希望參與展示的寶石直徑差距不要超過K個單位,也就是說直徑差距超過K的寶石不能同時展出。 問最多可以選擇多少顆寶石布展。
輸入
第一行兩個整數 N 和 K, 意義如題目所述。
之後 N 行, 每行一個數 D, 表示寶石的直徑。
數據範圍
N<=200,000
K<=1,000,000,000
D<=1,000,000,000
輸出
一個正整數, 表示最多可以展示的數量。
樣例輸入 Copy
7 3
10
5
1
12
9
5
14
樣例輸出Copy
3
/*題目描述
有N顆寶石, 安排在一個展示櫃展覽。 爲了展出的視覺效果, 希望參與展示的寶石直徑差距不要超過K個單位,也就是說直徑差距超過K的寶石不能同時展出。 問最多可以選擇多少顆寶石布展。
輸入
第一行兩個整數 N 和 K, 意義如題目所述。
之後 N 行, 每行一個數 D, 表示寶石的直徑。*/
#include<iostream>
using namespace std;
long const N = 100000000;
int a[N], tmp[N], n, k;
void Merge(int a[], int s, int m, int e, int tmp[])
{ // 將數組a a 的局部 a[s,m] 和 a[m+1,e] 合併到 tmp, 並保證 tmp 有序,然後再拷貝回 a[s,m]
// 歸併操作時間複雜度: o(e e- - m+1), 即o( n)
int pb = 0;
int p1 = s, p2 = m + 1;
while (p1 <= m && p2 <= e) {
if (a[p1] < a[p2])
tmp[pb++] = a[p1++];
else
tmp[pb++] = a[p2++];
}
while (p1 <= m)
tmp[pb++] = a[p1++];
while (p2 <= e)
tmp[pb++] = a[p2++];
for (int i = 0;i < e - s + 1; ++i)
a[s + i] = tmp[i];
}
void MergeSort(int a[], int s, int e, int tmp[]) {
if (s < e) {
int m = s + (e - s) / 2;
MergeSort(a, s, m, tmp);
MergeSort(a, m + 1, e, tmp);
Merge(a, s, m, e, tmp);
}
}
int main() {
int max = 0;
cin >> n >> k;
for (int i = 0;i < n;++i) //錄入每顆寶石直徑
cin >> a[i];
MergeSort(a, 0, n - 1, tmp); //利用臨時數組進行歸併排序
for (int i = 0;i < n;++i) {
tmp[i] = 1; //臨時數組再利用來記錄每個寶石能與其它寶石擺放的最多顆數;
}
for (int i = 0;i < n-1;++i) {
for (int j = i+1;j < n;++j) {
if((a[j] - a[i]) <= k) {
tmp[i]++; //搜索符合並列擺放的寶石並記錄;
}
else break;
}
}
for (int i = 0;i < n;++i) {
if (max < tmp[i])max = tmp[i];
}
cout << max; //將最大數輸出;
}