给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
暴力查找的时候注意,优化,即在循环外层的时候,至少可以少跑ma个间隔,因为有之前的状态满足,只需找更大的。
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<set> #include<map> #include<queue> #define inf 0x3f3f3f3f #define LL long long using namespace std; LL arr[100010]; int main(){ LL n,m,i,j,k; while(~scanf("%lld%lld",&n,&m)){ for(i = 0;i < n;++ i) scanf("%lld",&arr[i]); sort(arr,arr+n); LL ma = 0,po = 0,num; for(i = 0;i < n;++ i){ for(j = i+1+ma;j < n;++ j){ if(arr[i]*m >= arr[j]){ if(ma < (j-i+1)) ma = j - i+1; } else break; } } printf("%lld\n",ma); } return 0; }
本文介绍了一种求解完美数列的最大长度的算法。给定一个正整数数列和一个正整数p,若数列中的最大值不超过最小值乘以p,则该数列为完美数列。通过优化循环过程减少计算量,提高了算法效率。
2055

被折叠的 条评论
为什么被折叠?



