給定一個正整數數列,和正整數 ,設這個數列中的最大值是 ,最小值是 ,如果 ,則稱這個數列是完美數列。
現在給定參數 和一些正整數,請你從中選擇儘可能多的數構成一個完美數列。
輸入格式:
輸入第一行給出兩個正整數 和 ,其中 ()是輸入的正整數的個數,()是給定的參數。第二行給出 個正整數,每個數不超過 。
輸出格式:
在一行中輸出最多可以選擇多少個數可以用它們組成一個完美數列。
輸入樣例:
10 8
2 3 20 4 5 1 6 7 8 9
輸出樣例:
8
題解
如果用雙層循環的話,肯定是會超時的。
需要先排序。再用滑動窗口(雙指針)來解決此題。
不斷移動右邊界。然後用左邊界向右移動不斷試探。並記錄最大值。
示例過程如下:
1、先升序排序
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 |
2、兩個指針 和 指向第一個數據,最大長度
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 |
---|---|---|---|---|---|---|---|---|---|
3、因爲 ,且 ,所以 , 右移
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 |
---|---|---|---|---|---|---|---|---|---|
4、因爲 ,且 ,所以 , 右移
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 |
---|---|---|---|---|---|---|---|---|---|
5、因爲 ,且 ,所以 , 右移
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 |
---|---|---|---|---|---|---|---|---|---|
6、因爲 ,且 ,所以 , 右移
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 |
---|---|---|---|---|---|---|---|---|---|
7、因爲 ,且 ,所以 , 右移
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 |
---|---|---|---|---|---|---|---|---|---|
8、因爲 ,且 ,所以 , 右移
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 |
---|---|---|---|---|---|---|---|---|---|
9、因爲 ,且 ,所以 , 右移
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 |
---|---|---|---|---|---|---|---|---|---|
10、因爲 ,且 ,所以 , 右移
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 |
---|---|---|---|---|---|---|---|---|---|
11、因爲 ,所以 右移
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 |
---|---|---|---|---|---|---|---|---|---|
12、因爲 , 右移
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 |
---|---|---|---|---|---|---|---|---|---|
13、因爲 , 右移
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 20 |
---|---|---|---|---|---|---|---|---|---|
14、因爲 , 右移,,所以結束,因此最終結果是
C代碼
/*********************************************************************
Score: 25
Problem: 1030
Compiler: C(gcc)
Run Time: 25ms
Version: 1.2
Author: wowpH
Date: 2019-11-22 21:38:27
From: https://www.cnblogs.com/wowpH/p/11914428.html
*********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100000
long long arr[MAX_N];// 乘法會超過int型範圍
int compare(const void* a, const void* b);
int main(void) {
int N, p;
scanf("%d %d", &N, &p);
for (int i = 0; i < N; ++i) {
scanf("%lld", &arr[i]);
}
qsort(arr, N, sizeof(long long), compare);// 頭文件stdlib.h
int left = 0;
int right = 0;
int maxLen = 0;
while (right < N) {
while (left < N && arr[left] * p < arr[right]) {// mp>=M
++left;
}
if (right - left + 1 > maxLen) {
maxLen = right - left + 1;
}
++right;
}
printf("%d\n", maxLen);
return 0;
}
int compare(const void* a, const void* b) {
return *(int*)a - *(int*)b;// 升序
}
原文鏈接:https://www.cnblogs.com/wowpH/p/11914428.html