[AGC004B] Colorful Slimes 解题记录
题意简述
有 N 种颜色的史莱姆,捕获第 只需要 的能量,或者使用 的能量把当前所捕获的史莱姆的颜色编号都 。
题目分析
首先观察数据范围:,可以支持 的算法,这里我们考虑使用 。
设 表示获得第 种颜色,使用 次魔法的最小代价。
状态转移方程:,其中 。
答案 。
问题优化
因为 只与 有关,所以我们可以考虑优化一维,设 表示获得第 种颜色的最小代价。
所以优化后的状态转移方程:。
初始状态:。
答案在每次循环里面统计就行。
AC Code
#include<bits/stdc++.h>
#define arrout(a,n) rep(i,1,n)std::cout<<a[i]<<" "
#define arrin(a,n) rep(i,1,n)std::cin>>a[i]
#define rep(i,x,n) for(int i=x;i<=n;i++)
#define dep(i,x,n) for(int i=x;i>=n;i--)
#define erg(i,x) for(int i=head[x];i;i=e[i].nex)
#define dbg(x) std::cout<<#x<<":"<<x<<" "
#define mem(a,x) memset(a,x,sizeof a)
#define all(x) x.begin(),x.end()
#define arrall(a,n) a+1,a+1+n
#define PII std::pair<int,int>
#define m_p std::make_pair
#define u_b upper_bound
#define l_b lower_bound
#define p_b push_back
#define CD const double
#define CI const int
#define int long long
#define il inline
#define ss second
#define ff first
#define itn int
CI N=2005;
int n,x,ans=LLONG_MAX,a[N],dp[N];
signed main() {
std::cin>>n>>x;
rep(i,0,n-1){
std::cin>>a[i];
dp[i]=a[i];
}
rep(j,0,n-1){//压维
int s=0;
rep(i,0,n-1){
dp[i]=std::min(dp[i],a[(i-j+n)%n]);
s+=dp[i];
}
ans=std::min(ans,x*j+s);//统计答案
}
std::cout<<ans;
return 0;
}