PAT1030 完美数列 (C语言版本)

链接:PAT 1030 完美数列
算法思想:
count:用来记录,数列中完美数列的数字个数
index:用来记录数列中最大数的下标
max :存放完美数列中数字最多的数列的数字个数

  1. 对输入的数列进行排序;
  2. 从最小数字开始找以当前数为最小数存在的完美数列的数字个数;
  3. 算法优化(针对检测点4):由于步骤2中每次数列仅仅向前移动一位,丢掉一个数字,故我们不重置count = 0,而是count = count - 1。再保存上一次数列中的数字最大值index下标,从此数开始计算完美数列中的数字的个数。从而可以避免检测点4的超时。(程序中有标注这部分)
#include 
#include 
#define N 100010
int mycompare(const long long int* m, const long long int* n) {
	return *m - *n;
}
long long  num[N];
int main() {
	int n, m, i, j, max = 0, count = 1, index = 0;
	scanf("%d %d", &n, &m);

	for (i = 0; i < n; i++) {
		scanf("%lld", &num[i]);
	}
	qsort(num, n, sizeof(long long), mycompare);
	for (i = 0; i < n; i++) {
		//算法优化start
		count--;
		for (j = index; num[i] * m >= num[j] && j < n; j++) {
			count++;
		}
		index = j;
		//算法优化end
		if (count > max) {
			max = count;
		} 
	}
	printf("%d\n", max);
	return 0;
}

你可能感兴趣的:(C语言)