4 条题解
-
1
import math # 读取输入的第一行,站点数量 n 和每升油可以行驶的距离 d n, d = map(int, input().split()) # 初始化 v 和 a 数组,长度是站点数 n + 1(因为索引从1开始使用),初始化为0 v = [0] * (n + 1) a = [0] * (n + 1) # 读取输入的第二行,站点间的距离 t1 = list(map(int, input().split())) # 读取输入的第三行,各站点的油价 t2 = list(map(int, input().split())) # 填充 v 数组,v[i] 表示从站点 1 到站点 i 的总距离 for i in range(1, n): v[i] = t1[i - 1] # 计算从站点 1 到每个站点的累积距离 for i in range(1, n): v[i] = v[i - 1] + v[i] # 填充 a 数组,a[i] 表示第 i 个站点的油价 for i in range(1, n + 1): a[i] = t2[i - 1] # mi[i] 表示从站点 1 到站点 i 的最低油价 mi = [0] * (n + 1) mi[0] = a[1] # 初始化第一个站点的油价 # 计算每个站点的最低油价 for i in range(1, n + 1): mi[i] = min(a[i], mi[i - 1]) # 初始化当前油量和总花费 now = 0 ans = 0 # 遍历每个站点 for i in range(1, n + 1): # 如果当前油量比到达下一个站点所需的距离多,则无需加油 if now > v[i]: continue # 计算到达下一个站点最少需要的油量 must = math.ceil((v[i] - now) * 1.0 / d) # 计算在当前站点加这么多油需要的费用 ans += must * mi[i] # 更新当前油量 now += must * d # 输出最小总花费 print(ans)
-
1
2023CSP-J第二题原题 这是当年在考场上写的代码 (不开long long见祖宗) 思路是贪心,买油买到更便宜的站点
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; long long n,d,price,ans,s,oil; int a[N]; int v[N]; int main(){ scanf("%d%d",&n,&d); for(int i=1;i<=n-1;i++){ scanf("%d",&v[i]); } for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } int i=1,j=1; while(i<=n-1){ i=j; s=0; while(a[j]>=a[i]){ if(j>=n){ break; } s+=v[j]; j++; } if((s-oil)%d==0){ price=(s-oil)/d*a[i]; oil=0; }else{ price=((s-oil)/d+1)*a[i]; oil=d-(s-oil)%d; } ans+=price; if(j>=n){ break; } } cout<<ans; return 0; }
-
1
思路是每次跑到最近的价格更便宜的油站就不加油了。洛谷上有升级版,但是思路类似 旅行家的预算
n,d = map(int, input().split()) do = [0] p = [] do += list(map(int, input().split())) p += list(map(int, input().split())) do += [0] p += [0] kn = 0 # 当前的油站标号 ans = 0 pp = 0 # 油量需要跑多远 n += 1 for i in range(1, n): pp += do[i] if (p[i]<p[kn]): ls = pp//d # 加几升 if (ls*d!=pp) : ans += max(0, (ls+1)*p[kn]) pp = pp-(ls+1)*d # 油有剩余,记录一下 else : ans += max(0, ls*p[kn]) pp = 0 kn = i # 刷新所在油站 print(ans)
-
-1
😕 竞赛fw一枚捏 2023csp普及组第二题 csp考过了,但是图灵杯上被三进制卡了,做题策略没调整好,遗憾无缘AK
———————————————————
这题贪心,就是找到离当前最近的且油价比当前点低的点,加能够到该点的油 正常写法的话如果找不到比第一个点小的点就要找点n python懒得写了,粘个c++上来
#include <bits/stdc++.h> #define int long long int using namespace std; const int N = 1e5+5; bool ok[N]; int n,d,a[N],v[N]; signed main() { cin>>n>>d; for(int i=1;i<=n-1;i++) cin>>v[i]; for(int i=1;i<=n;i++) cin>>a[i]; int minn=INT_MAX; int ans=0,s=0; for(int i=1;i<n;i++) { s+=v[i]; minn=min(minn,a[i]); if (s>0) { ans+=(s+d-1)/d*minn; s-=(s+d-1)/d*d; } } cout<<ans; return 0; }
- 1
信息
- ID
- 935
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- 递交数
- 319
- 已通过
- 48
- 上传者