zoukankan      html  css  js  c++  java
  • 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
    **********************************************************************/
    
    
  • 相关阅读:
    先不说 console,其实你连 console.log 都不会
    2019 年终总结 & 2020 年度计划
    将毫秒格式化为天、小时、分钟、秒
    山村老事
    快速更改对象中的字段名
    基于 ECharts 封装甘特图并实现自动滚屏
    JS 将数值取整为10的倍数
    Flutter 徐徐图之(一)—— 从搭建开发环境到 Hello World
    Vue-Cli 3.x 创建的项目中对 import 引入的 CSS 样式启用 autoprefixer
    word——插入目录
  • 原文地址:https://www.cnblogs.com/artoriax/p/10370786.html
Copyright © 2011-2022 走看看