CSU-1170 A Simple Problem

题目链接

http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=1170

题目

Description

​ 在一个由N个整数组成的数列中,最多能找到多少个位置连续的整数且其中的最大值与最小值之差不超过K呢?

Input

​ 输入包含若干组数据。每组数据的第一行有2个正整数,N(1<=N<=\(10^6\)), K(0<=K<=\(10^6\)),其中N、K的含义同上,接下来一行一共有N个32位有符号整数(32-bit signed integer),依次描绘了这个数列中各个整数的值。

Output

​ 对于每组数据,输出一个正整数,表示在这个数列中最多能找到多少个位置连续的整数且其中的最大值与最小值之差不超过K。

Sample Input

4 2
3 1 5 2

3 2
3 1 2

Sample Output

2
3

Hint

​ 由于数据量较大,建议C++选手选用scanf来读取数据。

题解

因为题目要求连续的位置,那么我们直接扫一遍即可,初始\(l=1,r=1\),期间用multiset维护当前序列有多少个数,每次先判断一下multiset里最大数和最小数的差是否大于k,大于的话则则弹出\(a[l]\),不大于的话则加入\(a[r]\),顺便统计一下答案的最大值即可

AC代码

#include<bits/stdc++.h>
#include<set>
#define ll long long
#define maxn 1000050
using namespace std;
ll a[maxn];
inline ll getnum() {
    char c; ll ans = 0; ll flag = 1;
    while (!isdigit(c = getchar()) && c != '-');
    if (c == '-') flag = -1; else ans = c - '0';
    while (isdigit(c = getchar())) ans = ans * 10 + c - '0';
    return ans * flag;
}
int main() {
    ll n, k;
    multiset<ll> s;
    while (scanf("%lld%lld", &n, &k) != EOF) {
        s.clear();
        for (int i = 1; i <= n; i++) {
            a[i] = getnum();
        }
        int l = 1, r = 1;
        int ans = 0;
        s.insert(a[r]);
        while (r <= n) {
            ll now = *(--s.end()) - *(s.begin());
            if (now > k) {
                multiset<ll>::iterator it;
                it = s.find(a[l]); l++;
                s.erase(it);
            }
            else {
                ans = max(r - l + 1, ans);
                if (r + 1 <= n) s.insert(a[++r]);
                else break;
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}
/**********************************************************************
    Problem: 1170
    User: Artoriax
    Language: C++
    Result: AC
    Time:752 ms
    Memory:56700 kb
**********************************************************************/

转载于:https://www.cnblogs.com/artoriax/p/10370786.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值