Codeforces 965 D. Single-use Stones(思维)


Codeforces 965 D. Single-use Stones
题目大意:
有一条河宽度为w,河上有一些石头,给出一组数(编号1~w-1),其中a[i]代表与河一岸距离为i的石头数量。每只青蛙的跳跃距离为l(l<w),故要踩着石头到河的彼岸,且被踩过的石头将消失,问这条河最多可以让多少只青蛙过。
思路:
乍看之下感觉很复杂,思考是不是需要用DP来做。赛后看题解,其实这是一道思维题,问题的转化比较巧妙.
可以这样思考:任选一个i,计算其之前的源点[i-l+1 ~ i]的石头数总和,即为可以过i点的最大青蛙数sum[i],用前缀和的形式求出所有的sum[i]=pre[i]-pre[i-l],那么容易理解,答案就是sum中的最小值.
附上代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<climits>
using namespace std;
const int maxn=1e5+10;
long long pre[maxn];
int main()
{
    int i,n,l;
    long long ans=LLONG_MAX;
    cin>>n>>l;
    for (i=1;i<n;++i)
    {
        int a;
        scanf("%d",&a);
        pre[i]=pre[i-1]+a;
    }
    for (i=l;i<n;++i)
    {
        ans=min(ans,pre[i]-pre[i-l]);
    }
    cout<<ans;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/orangee/p/9061628.html