版权声明:Andy https://blog.csdn.net/Alibaba_lhl/article/details/82501220
Input
5 100 1
0 1 2 1 2
Output
101
Input
3 10 12
1 2 0
Output
-1
Input
3 12 1
0 1 0
Output
0
Source::Click here
题意
有n个舞者排成一排,她们其中一些人买了白色衣服,一些人买了黑色衣服,还有一些人未买衣服。目的:为了使舞者所穿的衣服颜色形成回文,即第一个和第n个颜色一样,第二个和第n-1个相同,等等。(0:已购买白色衣服,1:已购买黑色衣服,2:未买衣服)在所有舞者都不能交换位置和不能为已经有衣服的再次购买衣服的前提下,至少花费多少钱才达到形成回文的目的。
思路
题目数据范围n是20,所以循环跑一遍就行,分类讨论一下。详见code。
AC Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = (int)20;
int a[25];
int main()
{
int n, w, b;
scanf("%d %d %d",&n,&w,&b);
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
bool flag = true;
int i=1, j=n;
ll ans = 0;
while(i<=j)
{
if(i==j)
{
if(a[i]==2) ans += min(w,b);
break;
}
if(a[i]==0)
{
if(a[j]==0)
{
i++; j--;
continue;
}
if(a[j]==1)
{
flag = false;
break;
}
if(a[j]==2)
{
i++; j--;
ans += w;
continue;
}
}
if(a[i]==1)
{
if(a[j]==0)
{
flag = false;
break;
}
if(a[j]==1)
{
i++; j--;
continue;
}
if(a[j]==2)
{
i++; j--;
ans += b;
continue;
}
}
if(a[i]==2)
{
if(a[j]==0)
{
i++; j--;
ans += w;
continue;
}
if(a[j]==1)
{
i++; j--;
ans += b;
continue;
}
if(a[j]==2)
{
i++; j--;
ans += 2*min(w,b);
continue;
}
}
}
if(flag) printf("%lld\n",ans);
else printf("-1\n");
return 0;
}