NKOJ 7666 B
题目
思路:
设一共搬了k趟,当前一趟搬的是\(p_1,p_2,...,p_m\)。
显然最优方案是先走到\(p_m\),然后往前走
又得知距离越远的代价就越大
所以最后k个最先搬,往前k个再搬,一直搬到开头。
我做的时候想到DP去了,没有固定趟数,但是实际上在确定后方案是又规律的
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 200005
int n; ll p,x[N],s[N];
int main(){
cin>>n>>p;
for(int i=1;i<=n;i++)cin>>x[i],s[i]=s[i-1]+x[i];
ll res=1000000000000000000ll;
for(int k=1;k<=n;k++){
ll sum=(s[n]-s[n-k])*5;
for(int r=n-k,i=5;r>0;r-=k,i+=2){
int l=max(1,r-k+1);
sum+=(s[r]-s[l-1])*i;
if(sum+p*k>=res)break;
}
res=min(res,sum+p*k);
}
cout<<res+p*n;
return 0;
}

浙公网安备 33010602011771号