CF1491B Minimal Cost 题解

原题链接
洛谷链接

本题分为三种情况:

  1. n n n 个障碍物没有组成一堵墙:也就是说如果 max ⁡ i = 2 n { ∣ a i − a i − 1 ∣ } > 1 \max\limits_{i=2}^n\{|a_i-a_{i-1}|\}>1 i=2maxn{ aiai1}>1 那么则不需要花费任何费用,因为可以直接绕过障碍物
  2. n n n 个障碍物组成了一堵普通的墙:也就是 max ⁡ i = 2 n { ∣ a i − a i − 1 ∣ } = 1 \max\limits_{i=2}^n\{|a_i-a_{i-1}|\}=1 i=2maxn{ aiai1}=1。那么,我们有两种选择:横向挪动一个障碍物,使其转化为情况 1 1 1;或者纵向挪动一个障碍物,使得某一行没有障碍物。那么,所需要的费用就是 min ⁡ ( u , v ) \min(u,v) min(u,v)
  3. n n n 个障碍物组成了一堵完美的墙:也就是所有的 a i a_i ai 都相等。那么,我们只需要横向挪动任意一个障碍物,就把问题转化为了情况 2 2 2,所以情况三的所需费用就是 v + min ⁡ ( u , v ) v+\min(u,v) v+min(u,v)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int Maxn=110;
int n,u,v;
int a[Maxn];
inline int read()
{
    
    
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
    
    if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
    return s*w;
}
bool check1()
{
    
    
    for(int i=2;i<=n;++i)
    if(abs(a[i]-a[i-1])>1)return 1;
    return 0;
}
bool check2()
{
    
    
    for(int i=2;i<=n;++i)
    if(a[i]!=a[i-1])return 1;
    return 0;
}
int main()
{
    
    
    // freopen("in.txt","r",stdin);
    int T=read();
    while(T--)
    {
    
    
        n=read(),u=read(),v=read();
        for(int i=1;i<=n;++i)
        a[i]=read();
        if(check1())puts("0");
        else if(check2())printf("%d\n",min(u,v));
        else printf("%d\n",v+min(u,v));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Brian_Pan_/article/details/114263456