P1052 过河
作者:互联网
题意:给个长度为1e9的桥,青蛙从0开始每次能跳[s,t]的距离,给m个石头在桥上,求青蛙最少踩几个石头。
思路:因为m<100,l>1e9,所以可以对桥进行压缩,因为s,t属于[1,10],所以步数的最小公倍数是2520,如果两个石头时间距离大于2520,可以对石头之间的距离进行压缩,因为青蛙肯定会跳一个2520的距离。
#include<bits/stdc++.h> using namespace std; int a[150]; int book[2520*150]; int f[2520*150]; int d[105]; int main() { int l,s,t,m; scanf("%d%d%d%d",&l,&s,&t,&m); for(int i=1; i<=m; i++) scanf("%d",&a[i]); sort(a+1,a+1+m); for(int i=1; i<=m; i++) { if((a[i]-a[i-1])>2520) { int temp=(a[i]-a[i-1])/2520; a[i]=a[i]-2520*temp; } book[a[i]]=1; } memset(f,0x3f,sizeof(f)); f[0]=0; int len=a[m]+t; for(int i=1; i<=len; i++) for(int j=s; j<=t; j++) if(i-j>=0) f[i]=min(f[i],f[i-j]+book[i]); int ans=0x3f3f3f3f; for(int i=len-t; i<=len; i++) ans=min(ans,f[i]); printf("%d",ans); }
标签:150,过河,2520,int,d%,石头,P1052,book 来源: https://www.cnblogs.com/dongdong25800/p/11308835.html