过河

过河

https://ac.nowcoder.com/acm/problem/16655

看到L就知道,一定不能开个这么大的数组,且也不能按照这个1e9循环,一定超时;并且m石子数量只有100;所以,就需要用离散化进行化简。也就相当于,距离较远的石子用距离近的点代替;

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
#define ll long long
const ll maxn=2000000;
int l,s,t,h,m,discre[maxn],stone[maxn];//discre是离散化之后石子位置的数组,Stone是石子初始位置;
int dp[maxn];//记录到达i时,经过的最小石子数,dp[i]=min(dp[i],dp[i-j]+discre[i])
int main()
{
    cin>>l>>s>>t>>m;
    for(int i=1;i<=m;i++)
    cin>>stone[i];
    sort(stone+1,stone+1+m);//排序
    for(int i=1;i<=m;i++)//离散化,h记录了离散化之后的长度L
    {
        if(stone[i]-stone[i-1]>s*t) h+=(stone[i]-stone[i-1])%t+t*s;
//第i个石子的位置到前一个石子的位置大于t*s,进行离散;
        else h+=stone[i]-stone[i-1];
        discre[h]=1;
    }
    memset(dp,0x3f,sizeof(dp));
    dp[0]=0;
    for(int i=1;i<=h+t;i++)
    {
        for(int j=s;j<=t;j++)
            if(i>=j) dp[i]=min(dp[i],dp[i-j]+discre[i]);
    }
    int ans=0x3f;
    for(int i=h;i<=h+t;i++) ans=min(ans,dp[i]);
    cout<<ans;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务