打卡信奥刷题(2166)用C++实现信奥 P12327 [蓝桥杯 2023 省 Java B] 蜗牛
P12327 [蓝桥杯 2023 省 Java B] 蜗牛
题目描述
这天,一只蜗牛来到了二维坐标系的原点。
在 xxx 轴上长有 nnn 根竹竿。它们平行于 yyy 轴,底部纵坐标为 000,横坐标分别为 x1,x2,…,xnx_1, x_2, \ldots, x_nx1,x2,…,xn。竹竿的高度均为无限高,宽度可忽略。蜗牛想要从原点走到第 nnn 个竹竿的底部也就是坐标 (xn,0)(x_n, 0)(xn,0)。它只能在 xxx 轴上或者竹竿上爬行,在 xxx 轴上爬行速度为 111 单位每秒;由于受到引力影响,蜗牛在竹竿上向上和向下爬行的速度分别为 0.70.70.7 单位每秒和 1.31.31.3 单位每秒。
为了快速到达目的地,它施展了魔法,在第 iii 和 i+1i+1i+1 根竹竿之间建立了传送门(0<i<n0 < i < n0<i<n),如果蜗牛位于第 iii 根竹竿的高度为 aia_iai 的位置 (xi,ai)(x_i, a_i)(xi,ai),就可以瞬间到达第 i+1i+1i+1 根竹竿的高度为 bi+1b_{i+1}bi+1 的位置 (xi+1,bi+1)(x_{i+1}, b_{i+1})(xi+1,bi+1),请计算蜗牛最少需要多少秒才能到达目的地。
输入格式
输入共 1+n1 + n1+n 行,第一行为一个正整数 nnn;
第二行为 nnn 个正整数 x1,x2,…,xnx_1, x_2, \ldots, x_nx1,x2,…,xn;
后面 n−1n - 1n−1 行,每行两个正整数 ai,bi+1a_i, b_{i+1}ai,bi+1。
输出格式
输出共一行,一个浮点数表示答案(四舍五入保留两位小数)。
输入输出样例 #1
输入 #1
3
1 10 11
1 1
2 1
输出 #1
4.20
说明/提示
样例说明
蜗牛路线:(0,0)→(1,0)→(1,1)→(10,1)→(10,0)→(11,0)(0,0) \rightarrow (1,0) \rightarrow (1,1) \rightarrow (10,1) \rightarrow (10,0) \rightarrow (11,0)(0,0)→(1,0)→(1,1)→(10,1)→(10,0)→(11,0),花费时间为 1+10.7+0+11.3+1≈4.201 + \frac{1}{0.7} + 0 + \frac{1}{1.3} + 1 \approx 4.201+0.71+0+1.31+1≈4.20
评测用例规模与约定
对于 20%20\%20% 的数据,保证 n≤15n \leq 15n≤15;
对于 100%100\%100% 的数据,保证 1≤n≤1051\leq n \leq 10^51≤n≤105,1≤ai,bi≤1041\leq a_i, b_i \leq 10^41≤ai,bi≤104,1≤xi≤1091\leq x_i \leq 10^91≤xi≤109。
C++实现
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,a[N],b[N],x[N];
double dp[N][2];//状态定义
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",x+i);
for(int i=1;i<n;i++) scanf("%d%d",a+i,b+i);
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
dp[1][0]=dp[1][1]=x[1];
for(int i=2;i<=n;i++){//按照题目描述计算时间
dp[i][0]=min(dp[i-1][1]+x[i]-x[i-1],dp[i-1][0]+x[i]-x[i-1]);
double last=0;
if(a[i-1]<b[i-2]) last=(b[i-2]-a[i-1])/1.3;
else last=(a[i-1]-b[i-2])/0.7;
dp[i][1]=min(dp[i-1][0]+a[i-1]/0.7+b[i-1]/1.3,dp[i-1][1]-b[i-2]/1.3+last+b[i-1]/1.3);
}
printf("%.2lf",min(dp[n][0],dp[n][1]));//输出答案
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐


所有评论(0)