您的位置:首页 > 其它

PAT Basic Level 1030 完美数列 (25 分)

2019-01-21 20:25 232 查看

题目链接:

https://pintia.cn/problem-sets/994805260223102976/problems/994805291311284224

本人6分代码:

[code]#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <vector>
using namespace std;

int v[100010];
int m[10001][10001];

int main() {
int N;
int p;
cin >> N >> p;
for (int i = 0; i < N; i++)
cin >> v[i];

int max_len = 0;
sort(v, v + N);
for(int i=0;i<N;i++)
for (int j = i+1; j < N; j++)
{
m[i][j] = v[j] / v[i];
int len = j - i+1;
if (len>max_len&&(m[i][j] <= p)) {
max_len = len;
}
}

cout << max_len << endl;

 

AC代码:

[code]#include<iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;

const int maxn=100010;
int n,p,a[maxn];

//二分查找可以用upper_bound代替
int binarySearch(int i,long long x){
if(a[n-1]<=x)   return n;//如果所有数不大于x,返回n
int l=i+1,r=n-1,mid;//在[i+1,n-1]查找
while(l<r){
mid=(l+r)/2;
if(a[mid]<=x){
l=mid+1;
}
else{
r=mid;
}
}
return l;//返回l或者r均可
}

int main(){
scanf("%d%d",&n,&p);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);//递增排序
int ans=1;//最大长度,初值为1
for(int i=0;i<n;i++){
//在a[i+1]~a[n-1]中查找第一个超过a[i]*p的数,返回其位置给j
int j=binarySearch(i,(long long)a[i]*p);
//  int j=upper_bound(a+i+1,a+n,(long long)a[i]*p)-a;
ans=max(ans,j-i);
}
printf("%d\n",ans);//输出结果
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: