1030 完美数列 (25 分)(滑动窗口)


一.题目

在这里插入图片描述


二.分析

∙ \bullet 我们为了寻找满足题意的数字,那么首先第一步就得先将数列进行排序,然后依此从前往后查找。

∙ \bullet 在这里我使用了滑动窗口,避免重复进行计算。在循环时只要遵循两个式子就可以搜得最后结果。当满足题目条件时就将 r i g h t right right 加一,并且计算更新此时的数列长度,当不满足时就将 l e f t left left 加一。

∙ \bullet 注意题目中给出的 p p p 极大,所以需要使用 l o n g   l o n g long \ long long long 进行定义。


三.代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    int N=0;
    long long p=0;
    cin>>N>>p;
    vector<int>num(N,0);  //记录数列
    for(int i=0;i<N;i++) cin>>num[i];
    sort(num.begin(),num.end());  //排序数列
    int res=0;
    int left=0,right=0; //左右端口
    while(left<=right && right<N)
    {
        if(num[right]>num[left]*p) left++;
        else
        {
            right++;
            res=max(res,right-left);
        }
    }
    cout<<res;
    return 0;
}

四.结果

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比奇堡咻飞兜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值