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;
}
posted @ 2026-09-11 21:12  whs_1007  阅读(3)  评论(0)    收藏  举报