• 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
    ", ans);
    	}
    	return 0;
    }
    /**********************************************************************
    	Problem: 1170
    	User: Artoriax
    	Language: C++
    	Result: AC
    	Time:752 ms
    	Memory:56700 kb
    **********************************************************************/
    
    
  • 相关阅读:
    hdu3746 KMP的next数组应用,求项链首尾项链循环
    hdu4067 费用流(混合欧拉的宽展和延伸)
    hdu4067 费用流(混合欧拉的宽展和延伸)
    hdu1501 记忆化搜索
    hdu1501 记忆化搜索
    hdu1316 大数
    hdu1316 大数
    hdu4411 经典费用里建图
    hdu4411 经典费用里建图
    hdu4768 非常规的二分
  • 原文地址:https://www.cnblogs.com/artoriax/p/10370786.html
Copyright © 2020-2023  润新知