您的位置:首页 > 其它

蓝桥-BASIC-19-完美的代价

2017-05-31 23:40 190 查看
ACM模版

描述



题解

这个题一开始想岔了,一说交换最少次数使序列怎么样,我就想到了最少交换次数使序列有序的经典算法,想着可能是这个经典算法的一个变种,后来发现并不是这样的,其实只是一个简单的贪心就能解决的问题。

先从左往右选取左侧元素,然后从右侧开始往左侧查找匹配元素,每次找到后都移动到对称位置,累加移动次数即可……典型的贪心。

这个题远远没有想象中那么麻烦~~~

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

const int MAXN = 8888;

int n;
char s[MAXN];

int main()
{
scanf("%d%s", &n, s);

int sum = 0, flag = 1, tag = -1;
int len = n - 1;
for (int i = 0; i < len; i++)
{
for (int j = len; j >= i; j--)
{
if (j == i)
{
if (n % 2 == 0 || tag != -1)
{
flag = 0;
break;
}
tag = 1;
sum += n / 2 - i;
break;
}
if (s[j] == s[i])
{
for (int t = j; t < len; t++)
{
s[t] = s[t + 1];
}
sum += len - j;
len--;
break;
}
}
if (!flag)
{
break;
}
}

if (!flag)
{
printf("Impossible\n");
}
else
{
printf("%d\n", sum);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  贪心