。简单の题目
2025-11-02 23:03:44
发布于:广东
1阅读
0回复
0点赞
输入共三行,
第一行有
1
1 个正整数
L
L,表示独木桥的长度。
第二行有
3
3 个正整数
S
,
T
,
M
S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离及桥上石子的个数。
第三行有
M
M 个不同的正整数分别表示这
M
M 个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。所有相邻的整数之间用一个空格隔开。
代码:
#include<bits/stdc++.h>
using namespace std;
int l,s,t,m,a[110],dp[100010],b[110];
bool x[100010];
int main(){
cin>>l;
cin>>s>>t>>m;
for(int i=1;i<=m;i++)cin>>a[i];
sort(a+1,a+1+m);
if(st){
int ans=0;
for(int i=1;i<=m;i++)
if(a[i]%s0)ans++;//如果会经过它,答案+1
cout<<ans;//输出
return 0;
}
for(int i=1;i<=m;i++)
if(a[i]-a[i-1]>1000)b[i]=b[i-1]+1000;//注意啦,如果原来的距离小于1000,你要保持不变
else b[i]=a[i]-a[i-1]+b[i-1];
for(int i=1;i<=m;i++)x[b[i]]=true;//石头
l=b[m];
for(int i=1;i<=l+t-1;i++){
dp[i]=INT_MAX/2;
for(int j=s;j<=t&&j<=i;j++)dp[i]=min(dp[i],dp[i-j]);//转移状态
if(x[i])dp[i]++;
}int ans=dp[l];
for(int i=l;i<=l+t-1;i++)ans=min(ans,dp[i]);//打擂法求最小值
cout<<ans;//输出
return 0;
}
这里空空如也




有帮助,赞一个