4 条题解

  • 1
    @ 2024-6-1 7:39:05
    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
      @ 2024-5-29 20:55:49

      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
        @ 2024-5-29 19:39:50

        思路是每次跑到最近的价格更便宜的油站就不加油了。洛谷上有升级版,但是思路类似 旅行家的预算

        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
          @ 2024-5-26 20:12:06

          😕 竞赛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
          上传者