DB小左 题解分享 · 2025/3/30
蜗牛(编程题) - 题解
``` #include<bits/stdc++.h> using namespace std; typedef long long ll; double dp[100010][2];//dp数组记录用时 double arr[100010];//arr记录柱子x轴坐标 ll a[100010];//a记录起点 ll b[100010];//b记录终点 ll n;//柱子的数量 int main(){ //输入数据 cin>>n; for(int i = 1; i <= n; i++){ cin>>arr[i]; } for(int i = 1; i < n; i++){ cin>>a[i]>>b[i+1]; } b[1] = 0; a[n] = 0; //初始化dp dp[1][0] = arr[1]; dp[1][1] = arr[1]; //填表 for(int i = 2; i <= n; i++){ //去第i个柱子走传送门 double dis = b[i-1] > a[i-1] ? (b[i-1]-a[i-1])/1.3 : (a[i-1]-b[i-1])/0.7; dp[i][1] = min(dp[i-1][0] + a[i-1]/0.7 , dp[i-1][1] + dis); //去第i个柱子不走传送门 dp[i][0] = min(dp[i-1][0] + arr[i] - arr[i-1] , dp[i-1][1] + arr[i] - arr[i-1] + b[i-1]/1.3); //如果走传送门到终点,那就还要往下爬 if(i == n) dp[i][1] += b[i]/1.3; //cout<<dp[i][0]<<' '<<dp[i][1]<<endl; } double ans = min(dp[n][1], dp[n][0]); ans = round(ans*100)/100; printf("%.2f",ans); } ```
查看全文
1 0 0 8
11gou11 题解分享 · 2024/5/26
蜗牛(编程题) - 题解
``` #include using namespace std; const int N=100001; int n,a[N],b[N],x[N]; double f[N][2]; int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>x[i]; for(int i=1;i<=n-1;i++) { cin>>a[i]>>b[i]; } f[1][0]=x[1]; f[1][1]=x[1]+a[1]/0.7; for(int i=2;i<=n;i++){ f[i][0]=f[i-1][0]+x[i]-x[i-1]; f[i][0]=min(f[i][0],f[i-1][1]+b[i-1]/1.3); f[i][1]=f[i][0]+a[i]/0.7; f[i][1]= min(f[i][0]+a[i]/0.7,f[i-1][1]+abs(a[i]-b[i-1])/(a[i]>b[i-1]?0.7:1.3)); } printf("%.2lf", f[n][0]); } /* f[i][0]表示到第i根棍的底部所用时间 f[i][1]表示到第i根棍的传送门位置所用时间 1.在坐标轴上走:f[i][0]=f[i-1][0]+x[i]-x[i-1]; 2.做传送门: f[i][0]=f[i-1][1]+b[i-1]/1.3; 1.在坐标轴上走:f[i][1]=f[i-1][0]+x[i]-x[i-1]+a[i]/0.7=f[i][0]+a[i]/0.7; 2.做传送门: f[i][1]=f[i-1][1]+(a[i]-b[i-1])/0.7或 f[i-1][1]+(b[i-1]-a[i])/1.3; 即 f[i][1]= f[i-1][1]+abs(a[i]-b[i-1])/(a[i]>b[i-1]?0.7:1.3) */ ```
查看全文
0 0 0 3