题目
1059 Perfect Sequence (25)
解题思路
- 1.先排序然后找出每个点的最大长度。
- 2.对于起点i,假设循环找到的最后一个满足条件的位置 j >= i,那么对于起点为 i+1 ,j也会满足,例如排好序后序列为:1 2 3 4 5 6 7 8 9 20,p = 8,对于i = 0,那么最后一个满足条件的位置为 i = 7,即数字8,那么对于起点为 i+1,显然a[i + 1] * p = 2 * 8 > a[j] = 8也满足,则i+1可以直接从j开始考虑了。
- 3.注意如果是乘以p,则结果可能会溢出。
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n,p;
int main(){
cin >> n >> p;
vector<int> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
sort(a.begin(),a.end());
vector<int> b(n,0);
int pre= 0,maxlen = 0;
for (int i = 0; i < n; ++i) {
for (int j = max(i,pre); j < n; ++j) {
if((double)a[j]/(double)p <= a[i]){
b[i] = j - i + 1;
pre = j;
}
else
{
break;
}
}
maxlen = max(maxlen,b[i]);
}
cout<<maxlen<<endl;
return 0;
}