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; 
}
posted @ 2024-04-17 11:00  YuKiCheng  阅读(4)  评论(0编辑  收藏  举报