题意
有一个青蛙过桥,桥上有一些石头,桥长L,青蛙每次能跳[s,t]间的一个距离,问青蛙跳过桥最少才到的石头数输入描述
第一行有一个正整数L(1<=L<=1e9),表示独木桥的长度。
第二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中1<=S<=T<=10,1<=M<=100。
第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。
所有相邻的整数之间用一个空格隔开。
输出描述
只包括一个整数,表示青蛙过河最少需要踩到的石子数。
思路
很明显这个题目要用dp来解决,有石头的时候就是dp[i]=min(dp[i],dp[i-j]+1) s<=j<=t 没有石头的时候dp=[i]=min(dp[i],dp[i-j]) s<=j<=t.然后看这个数据桥长1e9,而石头的数目不超过100,很明显要使用离散化(ps:菜鸡离散化不是很会用,只会依葫芦画瓢,我太难了)代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[100001];
ll stone[101];
bool vis[100001]; //记录离散化之后石头的位置
void chushi(){
for(ll i=0;i<10001;++i)
dp[i]=0x3f;
}
int main(void){
ios::sync_with_stdio(false);
ll l,s,t,m;
cin>>l>>s>>t>>m;
chushi();
memset(vis,0,sizeof(vis)); //初始化dp数组和石头的位置
for(ll i=1;i<=m;++i)
cin>>stone[i];
sort(stone,stone+m+2);
ll ide=0; //离散化处理
for(ll i=1;i<=m+1;i++){
if(stone[i]-stone[i-1]<=t*s)
ide+=stone[i]-stone[i-1];
else
ide+=(stone[i]-stone[i-1])%t+t;
vis[ide]=true;
}
dp[0]=0;
for(ll i=1;i<=ide+t;i++)
for(ll j=s;j<=t;j++)
if((i-j)>=0)
dp[i]=min(dp[i],dp[i-j]+vis[i]);
ll ans=0x3f;
for (ll i=ide;i<=ide+t;i++)
ans=min(ans,dp[i]);
cout<<ans;
return 0;
}
/*
10
2 3 5
2 3 5 6 7
2
*/
京公网安备 11010502036488号