1030 完美數列

2021-07-09 22:12:44 字數 2013 閱讀 9276

給定乙個正整數數列,和正整數p,設這個數列中的最大值是m,最小值是m,如果m <= m * p,則稱這個數列是完美數列。

現在給定引數p和一些正整數,請你從中選擇盡可能多的數構成乙個完美數列。

輸入格式:

輸入第一行給出兩個正整數n和p,其中n(<= 105

)是輸入的正整數的個數,p(<= 109

)是給定的引數。第二行給出n個正整數,每個數不超過109

輸出格式:

在一行中輸出最多可以選擇多少個數可以用它們組成乙個完美數列。

輸入樣例:

10 8

2 3 20 4 5 1 6 7 8 9

輸出樣例:

演算法:演算法開始。

讀入n和p。

讀入所有數字,存於a[n],排序。

i=0,max=0。

如果a[i]*p>a[n-1],則跳到

用二分法找出大於a[i]*p的最小數字的下表j。

如果j-i小於max而且如果p等於1或者j-i不等於1,max等於j-i。

回到第五步。

如果n-i小於max而且如果p等於1或者n-i不等於1,max等於n-i。

輸出max。

演算法結束。

#include#includeint cmp(const void* v1, const void* v2);

int find_min_larger(int* array, int i, int p, int n);

int main(void)

qsort(array, n, sizeof(int), cmp);

num = (double)(array[0]) * (double)p;

for (i = 0; (num = (double)(array[i]) * (double)p) < array[n - 1]; i++)

} if ((n - i > max) && ((n - i != 1)||p==1))

printf("%d", max);

return 0;

}int cmp(const void* v1, const void* v2)

else if(*((int*)v1)==*((int*)v2))

else

}int find_min_larger(int* array, int i, int p, int n)

else if (num >= array[end])

else

else

} }if (num < array[start])

else

}

上段**對二分查詢法的使用不是特別漂亮,現在修改如下。

#include#includeint cmp(const void* v1, const void* v2);

int find_min_larger(int* array, int i, int p, int n);

int main(void)

qsort(array, n, sizeof(int), cmp);

num = (double)(array[0]) * (double)p;

for (i = 0; (num = (double)(array[i]) * (double)p) < array[n - 1]; i++)

}if ((n - i > max) && ((n - i != 1) || p == 1))

printf("%d", max);

return 0;

}int cmp(const void* v1, const void* v2)

int find_min_larger(int* array, int i, int p, int n)

else

}return start;

}

1030 完美數列

給定乙個正整數數列,和正整數p,設這個數列中的最大值是m,最小值是m,如果m m p,則稱這個數列是完美數列。現在給定引數p和一些正整數,請你從中選擇盡可能多的數構成乙個完美數列。輸入格式 輸入第一行給出兩個正整數n和p,其中n 105 是輸入的正整數的個數,p 109 是給定的引數。第二行給出n個...

1030 完美數列

1030.完美數列 給定乙個正整數數列,和正整數p,設這個數列中的最大值是m,最小值是m,如果m m p,則稱這個數列是完美數列。現在給定引數p和一些正整數,請你從中選擇盡可能多的數構成乙個完美數列。輸入格式 輸入第一行給出兩個正整數n和p,其中n 105 是輸入的正整數的個數,p 109 是給定的...

1030 完美數列

給定乙個正整數數列,和正整數p,設這個數列中的最大值是m,最小值是m,如果m m p,則稱這個數列是完美數列。現在給定引數p和一些正整數,請你從中選擇盡可能多的數構成乙個完美數列。輸入格式 輸入第一行給出兩個正整數n和p,其中n 105 是輸入的正整數的個數,p 109 是給定的引數。第二行給出n個...