当前位置: 代码迷 >> 综合 >> 【枚举】AGC004B Colorful Slimes
  详细解决方案

【枚举】AGC004B Colorful Slimes

热度:86   发布时间:2023-09-27 06:01:50.0

分析:

没什么营养的水题。。。

直接枚举一个k表示操作2做了多少次,然后枚举每个位置,那个位置的代价为
min{ai?k,ai?k+1……ai]}min\{a_{i-k},a_{i-k+1}……a_i]\}min{ ai?k?,ai?k+1?ai?]},所有点代价求和后加上k?xk*xk?x,就是进行k次2操作的最小代价。

区间最小值可以O(n2)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;elseans=min(ans,sum+x*k);}PF("%lld",ans);
}