PAT乙级 完美数列(25)

来源:互联网 发布:微信淘宝天猫内部优惠 编辑:程序博客网 时间:2024/05/18 01:59

题意:

构造一个完美数列,符合最大值<=最小值*p,参数p会在输入中给出,构造一个符合这个规则的最长序列.

先用sort快排一下整个序列,之后从最小值开始计算,利用最小值*p这个数值在序列中二分查找,时间复杂度nlogn.

#include "iostream"#include "string.h"#include "string"#include "vector"#include "algorithm"using namespace std;//M <= m * pint binary_search(vector<int> array,int n,int value,int sub){int left = 0;int right = n-1;while(left<=right){int middle = left + ((right-left)>>1);if(array[middle]>value && array[middle-1]<value)return middle - sub;else if(array[middle]<value){if(middle == n-1)return middle + 1 - sub;else if(array[middle+1]>value) return middle + 1 - sub;}if(array[middle]>value){right = middle - 1;}else if(array[middle]<value){left = middle + 1;}elsereturn middle + 1 - sub;}return -1;}int main(){int count,p,temp;int i;int max = 0;cin>>count>>p;vector<int> num;/*//testcount = 100000;p = 42;for(i=1;i<=50000;i++){num.push_back(i);}for(i=100000;i>50000;i--){num.push_back(i);}*/for(i=0;i<count;i++){cin>>temp;num.push_back(temp);}sort(num.begin(),num.end());for(i=0;i<count;i++){if(i>0&&num[i] == num[i-1])continue;if(max>count-i-1)break;//test//cout<<"参数:"<<count<<" "<<(num[i]*p)<<" "<<i<<endl; temp = binary_search(num,count,num[i]*p,i);if(temp>max)max = temp;}cout<<max<<endl;return 0;}


0 0
原创粉丝点击