CSUOJ 1170 A sample problem

Posted buerdepepeqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSUOJ 1170 A sample problem相关的知识,希望对你有一定的参考价值。

J: A Simple Problem

    Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 87     Solved: 12    


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
技术分享图片
#include<cstdio>
#include<iostream>
#include<cmath>
#include<string.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
char s[10],c[10];
const int MAXN=1000005;
ll A[MAXN];
int main(){
    ll x,y;
    ll maxx=-1,minn=999999;
/*set和multiset 会根据特定的排序准则,
自动将元素排序。两者不同之处,
在于multiset允许元素重复,而set不允许重复*/
    multiset<ll> ss;
    while(scanf("%lld%lld",&x,&y) !=EOF){
        for(int i=0;i<x;i++){
            scanf("%lld",&A[i]);
        }
        ll nlen=0;
        ll maxi=0,mini=0;
        ll left=0,right=0;
        ss.insert(A[0]);
        while(right != x){
            maxx=*(--ss.end());
            minn=*ss.begin();
            if(maxx-minn<=y){
                nlen=right-left+1>nlen?right-left+1:nlen;
                ss.insert(A[++right]);
            }
            else{
                auto pos=ss.find(A[left++]);
                ss.erase(pos);
            }
        }
        cout<<nlen<<endl;
        ss.clear();
    }
    return 0;
}
View Code

 

以上是关于CSUOJ 1170 A sample problem的主要内容,如果未能解决你的问题,请参考以下文章

1170: 非常男女(XCOJ 前缀和)

[CSUOJ1804]有向无环图(树dp)

csuoj-1721-皇家火枪手

POJ - 1170 Shopping Offers (五维DP)

hdu 1028 Sample Ignatius and the Princess III (母函数)

mysql #1170错误(42000) BLOB/TEXT Column Used in Key Specification Without a Key Length