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√

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值