分析:
没什么营养的水题。。。
直接枚举一个k表示操作2做了多少次,然后枚举每个位置,那个位置的代价为
m
i
n
{
a
i
−
k
,
a
i
−
k
+
1
…
…
a
i
]
}
min\{a_{i-k},a_{i-k+1}……a_i]\}
min{ai−k,ai−k+1……ai]},所有点代价求和后加上
k
∗
x
k*x
k∗x,就是进行k次2操作的最小代价。
区间最小值可以 O ( n 2 ) O(n^2) O(n2)预处理出来。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define SF scanf
#define PF printf
#define MAXN 2010
#define INF 1073741824
using namespace std;
typedef long long ll;
int n;
ll a[MAXN],x,ans;
ll tree[MAXN*4];
ll minv[MAXN][MAXN];
int main(){
SF("%d%lld",&n,&x);
for(int i=1;i<=n;i++)
SF("%lld",&a[i]);
for(int i=1;i<=n;i++){
minv[i][i]=a[i];
for(int j=i+1;j<=n;j++)
minv[i][j]=min(minv[i][j-1],a[j]);
}
ll ans=-1;
for(int k=0;k<n;k++){
ll sum=0;
for(int l=1;l<=k;l++)
sum+=min(minv[1][l],minv[(l-k+n-1)%n+1][n]);
for(int l=k+1;l<=n;l++)
sum+=minv[l-k][l];
if(ans==-1)
ans=sum+x*k;
else
ans=min(ans,sum+x*k);
}
PF("%lld",ans);
}