PTA刷题Basic篇——1030.完美数列——Day(15)

问题描述

在这里插入图片描述
找出在输入数组中满足最大值<=最小值*参数p的最长序列。

题目分析

先介绍一下C++中upper_bound()这个函数:假设有数组a
upper_bound(a+i,a+j,x) - a返回的是数组a中第一个大于x的位置(注意:这里返回的是一个具体的位置)。
所以我们想,如果我们遍历数组,从不同位置出发,如果可以找到第一个大于m*p的位置,那么这个位置-起始位置不就是我们序列的长度了嘛

代码

#include<iostream>
#include <algorithm>
using namespace std;
const int maxn = 100010;
int n, p, a[maxn];
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;
    for(int i = 0; i < n; i++){
        //upper_bound返回的是第一个大于a[i]*p的元素指针
        //a表示数组的头指针,不指向任何元素,那么我们就需要对其进行+1,让其指向第一个元素,然后查找第一个大于a[i]*p的元素指针
        //用这个指针减去头指针a就是这个指针所在的数组索引
        //再用这个值-i即可得到这一段序列长度,例如5-2=3,因为索引5已经大于了a[i]*p,所以序列长度为3
        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;
} 

答题用时15min
Q30——finish√

原创文章 101 获赞 13 访问量 2310

猜你喜欢

转载自blog.csdn.net/weixin_44755413/article/details/105679721