1030. 完美数列
题目截图:
思路:
two pointers,先将数列升序排序,然后查找最长完美数列。详解见另一篇博客。
代码:
1 /* 2 1030. 完美数列 3 */ 4 5 #include <stdio.h> 6 #include <string.h> 7 #include <math.h> 8 #include <stdlib.h> 9 #include <time.h> 10 11 #define maxn 100002 12 int num[maxn] = {0}; 13 14 int cmp(const void* a, const void* b) { 15 return *(int*)a-*(int*)b; 16 } 17 18 int main() { 19 int N, p, i, j; 20 scanf("%d %d", &N, &p); 21 for(i=0; i<N; ++i) { 22 scanf("%d", &num[i]); 23 } 24 // 将数组升序排序 25 qsort(num, N, sizeof(int), cmp); 26 int result = 0; // 存储当前求得的最大长度 27 for(i=0; i<N; ++i) { // 序列开始位置 28 for(j=i+result; j<N; ++j) { // 使用当前最大长度 29 if((double)num[j]/num[i]<=p) { 30 if(j-i+1>result) { // 长度更长 31 result = j-i+1; // 更新长度 32 } 33 } else { 34 break; 35 } 36 } 37 } 38 printf("%d", result); 39 40 return 0; 41 }