本题分为三种情况:
- 这 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{∣ai−ai−1∣}>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{∣ai−ai−1∣}=1。那么,我们有两种选择:横向挪动一个障碍物,使其转化为情况 1 1 1;或者纵向挪动一个障碍物,使得某一行没有障碍物。那么,所需要的费用就是 min ( u , v ) \min(u,v) min(u,v)
- 这 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;
}