50pts超时了,谁能帮忙调一下
查看原帖
50pts超时了,谁能帮忙调一下
1061019
sunjiarui7281楼主2023/11/19 19:42
#include<bits/stdc++.h>
using namespace std;
int v[100010];//dis
int a[100010];//price
int minpricenum[100010];
long long sum[100010];//dis sum
int t[100010];//houji
int main(){
//    freopen("road.in","r",stdin);
//    freopen("road.out","w",stdout);
    int n,d;
    cin>>n>>d;
    for(int i=1;i<n;i++){
        scanf("%d",&v[i]);
    }
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    sum[1]=0;
    for(int i=2;i<=n;i++){
        sum[i]=sum[i-1]+v[i-1];
    }
    minpricenum[1]=1;
    for(int i=2;i<=n;i++){
        if(a[minpricenum[i-1]]>a[i]){
            minpricenum[i]=i;
        }
        else{
            minpricenum[i]=minpricenum[i-1];
        }
    }
    int was=n;
   while(was>1){
      if(minpricenum[was]==was){
        t[minpricenum[was-1]]=was;
        was=minpricenum[was-1];
      }
      else{
      t[minpricenum[was]]=was;
      was=minpricenum[was];
      }
   }
   int cnt=0,oil=0,ans=0;
   int i=1;
   while(cnt<sum[n]){
       if((sum[t[i]]-cnt)%d==0){
            ans+=((sum[t[i]]-cnt)/d)*a[i];
            cnt+=((sum[t[i]]-cnt)/d)*d;
        }
       else {
        ans+=((sum[t[i]]-cnt)/d+1)*a[i];
        cnt+=((sum[t[i]]-cnt)/d+1)*d;
        }
       i=t[i];
   }
   cout<<ans;
   return 0;
}
2023/11/19 19:42
加载中...