1 solutions

  • 0
    @ 2025-11-5 17:27:50

    C++ :

    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    using namespace std;
    double f[1001];
    long long len,wei,n,w[1001],v[1001],sum[1001],vmin[1001][1001];
    int main ()
    {
        scanf ("%I64d%I64d%I64d",&wei,&len,&n);
        for (int b=1;b<=n;++b){scanf ("%I64d%I64d",&w[b],&v[b]);sum[b]=sum[b-1]+w[b];vmin[b][b]=v[b];}
        for (int b=1;b<n;++b)for (int c=b+1;c<=n;++c)vmin[b][c]=min(v[c],vmin[b][c-1]);
        for (int i=1;i<=n;++i)
        {
            f[i]=(double)len/v[i]+f[i-1];
            for (int j=i-1;j>=1;--j)
                if (sum[i]-sum[j-1]<=wei)f[i]=min(f[i],f[j-1]+(double)len/vmin[j][i]);
                else break;
        }
        printf ("%.1lf",f[n]*60);
        return 0;
    }
    

    Pascal :

    var
    max,len,n:int64;
    i,j:longint;
    w,v,f:array[0..1000]of extended;
    minv,t:extended;
    begin   
    read(max,len,n);  
    for i:=1 to n do  
    read(w[i],v[i]);  
    f[0]:=0;   
    f[1]:=len/v[1]; 
    for i:=2 to n do     
    begin           
    f[i]:=1e24;        
    minv:=1e24;         
    t:=0;          
    for j:=i downto 1 do  
    begin                  
    t:=t+w[j];              
    if v[j]<minv then minv:=v[j]; 
    if t>max then break;              
    if minv<>0 then if f[j-1]+len/minv<f[i] then f[i]:=f[j-1]+len/minv;       
    end;    
    end;  
    writeln(f[n]*60:0:1);   
    end.
    
    • 1

    Information

    ID
    18455
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By