1030 完美数列
直观:(25分)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector<ll> vec;
map<ll,int> mp;//元素-所在下标
int main(){
int n;
ll p;
cin>>n>>p;
for(int i=0;i<n;i++){
int no;
cin>>no;
vec.push_back(no);
}
//进行排序
sort(vec.begin(),vec.end());
for(int i=0;i<vec.size();i++){
ll ele = vec[i];
mp[ele] = i;
}
//遍历
int dist = 1;
for(int i=0;i<vec.size();i++){
//作为最小元素
if(mp[vec[i]*p]){//如果存在
dist = max(dist,mp[vec[i]*p]-i+1);
}else{
int index = lower_bound(vec.begin(),vec.end(),vec[i]*p)-vec.begin();//第一个大于等于x的元素
dist = max(dist,index-i);
}
}
cout << dist << '\n';
return 0;
}
进一步梳理,如果mp不止一个,那么应该是取最远的那个,所以lower_bound应该用upper_bound,大于mp的第一个,那么这个index-1就是符合要求的。
如果返回的是vec.end(),那么说明没找到,距离最长的自然是最后一个元素了。
使用upper_bound(25分)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector<ll> vec;
int main(){
int n;
ll p;
cin>>n>>p;
for(int i=0;i<n;i++){
int no;
cin>>no;
vec.push_back(no);
}
int dist = 1;
vector<ll>::iterator it;
sort(vec.begin(),vec.end());
for(int i=0;i<vec.size();i++){
ll mp = vec[i] * p;
int index = upper_bound(vec.begin(),vec.end(),mp) - vec.begin();
dist=max(dist,index-i);
}
cout << dist << '\n';
return 0;
}