給定乙個正整數數列,和正整數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個...