Blue

Blue 是个动物学家,不仅喜欢研究猫和老鼠,还喜欢研究青蛙。

他最近开始研究青蛙过河的问题,可以简化成:数轴上0为岸边,L为河对岸。(0,L)中间存在 n 个石子。已知青蛙一跳可以跳距离D,而且不能沾水。求问能不能跳到河对岸。当然他觉得这个问题非常 naïve,于是在思考如果青蛙有 m个,且石头被踩过之后就会沉下去,m个青蛙还能不能依次安全过河。如果不能则问最多能有多少个过河。

输入

第一行为一个正整数T代表数据组数。每组数据第一行四个正整数:n、m、D、L第二行 n 个升序正整数 ai代表第 i个石子坐标为 ai。保证没有重复且都小于L。

输出

TT行”Excited”代表全部能过河或者一个整数代表有多少个能过河的。

对于 10%的数据保证 m=1.

对于另外 10%的数据保证 D=L.

对于另外 10%的数据保证 n=L-1.

对于另外 30%的数据保证 n<=100, L<=10^5.

对于 100%的数据保证 m<=n<=10^6,D<=L<=10^9.

数据范围中的 n、m 皆代表题目描述中 n、m 的总和。

SAMPLE

INPUT

5

10 9 16 30

2 4 6 9 11 15 18 19 25 27

10 1 23 30

10 11 13 14 15 16 18 26 27 29

10 7 28 30

2 3 7 9 12 15 20 24 27 28

10 3 18 30

1 6 9 14 18 19 22 27 28 29

10 7 10 30

1 2 4 6 18 19 20 22 23 26

OUTPUT

5

Excited

Excited

Excited

0


思路:

画个图其实就出来了(考试手懒没画……) 

很显然的结论,最多只有k个 (pos[i+k]-pos[i]>=d) 只青蛙可以过河

因为最远可以跳到的石头之前的石头一定是站满的(青蛙足够多)

所以我们只需要枚举每个石头的最远距离就可以啦~

code

#include<stdio.h> 
#include<algorithm> 
using namespace std;
const int mxn=1e6+10;
int n,m,d,L,pos[mxn];

inline int In() {
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0' || ch>'9') {
        if(ch=='-') f=-1;ch=getchar();
    }
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*f;
}

void Sol() {
    pos[0]=0,pos[n+1]=L;
    int ans=m,now=0;
    for(int i=0;i<=n;++i) {
        while(now!=n+1 && pos[now+1]-pos[i]<=d) now++;
        if(i==now) {
            printf("0
");return;
        }
        if(now==n+1) break;
        ans=min(ans,now-i);
    }
    if(ans==m) printf("Excited
");
    else printf("%d
",ans);
}

void file() {
    freopen("blue.in","r",stdin);
    freopen("blue.out","w",stdout);
}

int main() 
{
//    file();
    int T=In();
    while(T--) {
        n=In(),m=In(),d=In(),L=In();
        for(int i=1;i<=n;++i) pos[i]=In();
        if(d>=L) {
            printf("Excited
");continue;
        }
        Sol();
    }
    return 0;
}
/*
5
10 9 16 30
2 4 6 9 11 15 18 19 25 27
10 1 23 30
10 11 13 14 15 16 18 26 27 29
10 7 28 30
2 3 7 9 12 15 20 24 27 28
10 3 18 30
1 6 9 14 18 19 22 27 28 29
10 7 10 30
1 2 4 6 18 19 20 22 23 26
*/
原文地址:https://www.cnblogs.com/qseer/p/9877585.html