列表

详情


NC17373. 青蛙

描述

一条河流上有 m+2 块石头,其中最左的石头坐标为 1 ,最右的为 n 。

现在在起点 1 有无数只青蛙,每个青蛙一步可以跳 ≤ d 的任意长度,每个石头(除了起点,终点)只能被跳一次,问最多有多少只青蛙可以跳到终点 n 。

有多组数据。

输入描述

第一行 1 个数 t 表示数据组数。

接下来 t 组数据。

每组数据的第一行 3 个数表示 n,m,d ,第二行 m+2 个数表示石头坐标,保证递增。

输出描述

t 行,第 i 行一个数表示第 i 组数据的答案。

示例1

输入:

1
10 3 3
1 4 6 8 10

输出:

1

说明:

对于一只青蛙,1 4 6 8 10依次跳即可。

对于两只及以上的青蛙,可以证明是不可能的。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 248ms, 内存消耗: 30404K, 提交时间: 2020-08-05 10:50:43

#include<bits/stdc++.h>
#pragma GCC optimize(3,"Ofast","inline")
#define Fox ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N=3e5+10;
const int mod=1e9+7;
int T,n,m,d,a[N];
int main(){
	Fox;
	cin>>T;
	while(T--){
		cin>>n>>m>>d;
		m+=2;
		for(int i=1;i<=m;i++)cin>>a[i];
		int r=1,ans=N;
		for(int i=1;i<=m && r<=m;i++){
			while(r<=m && a[r]-a[i]<=d)r++;
			ans=min(ans,r-i-1);
		}
		cout<<ans<<"\n";
	}
	return 0;
}

pypy3 解法, 执行用时: 1505ms, 内存消耗: 114944K, 提交时间: 2022-07-11 13:11:25

from sys import stdin
input = stdin.readline
for i in range(int(input())):
    n,m,d = map(int,input().split())
    s = list(map(int,input().split()))
    f = [0] 
    for i in s:
        f.append(i)
    l  = 1
    ans = 1e9 + 1
    m +=2
    for i in range(1,m + 1):
        while l <= m and f[l] - f[i] <= d:
            l += 1
        ans = min(ans ,l - i - 1)
        if l == m + 1:
            break
    print(ans)

C++(clang++ 11.0.1) 解法, 执行用时: 930ms, 内存消耗: 1476K, 提交时间: 2023-02-02 00:11:34

#include<bits/stdc++.h>
using namespace std;
int a[310000];
int main()
{
	int t,n,m,d;
	cin>>t;
	while(t--){
		cin>>n>>m>>d;
		m+=2;
		for(int i=1;i<=m;i++)
		cin>>a[i];
		int wei=1,ret=0x3f3f3f3f;
		for(int i=1;i<=m;i++){
			if(wei==m+1)
			break;
			while(wei<=m&&a[wei]-a[i]<=d)
			wei++;
			ret=min(ret,wei-i-1);
		}
		cout<<ret<<endl;
	}
    return 0;
}

上一题