蓝桥杯—密码脱落



密码脱落

X星球的考古学家发现了一批古代留下来的密码。
这些密码是由A、B、C、D 四种植物的种子串成的序列。
仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。

你的任务是:
给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。

输入一行,表示现在看到的密码串(长度不大于1000)
要求输出一个正整数,表示至少脱落了多少个种子。

例如,输入:
ABCBA
则程序应该输出;
0

再例如,输入:
ABDCDCBABC
则程序应该输出:
3

资源约定:
峰值内存消耗 < 256M
CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。


思想:贪心思想,从字符串的两端向中间比较,如果相同的话,就继续比较,不用的话比较修改左边和右边需要添加的字符的多少,选择少的那一边然后从相同的字符处继续比较直到比较完成。


代码:

#include

using namespace std;
const int maxn = 1050;

char a[maxn];
int len, ans;

void greedy()
{
    int l, r, rl, rr;
    l = 0;
    r = len - 1;
    ans = 0;

    while (l <= r)
    {
        if (a[l] == a[r])
        {
            l++;
            r--;
        }
        else
        {
            rl = l;
   rr = r;
            
            while (a[rl] != a[r]&&rl < r) rl++;
            while (a[l] != a[rr]&&l <= rr) rr--;
           
            if (rl - l > r - rr)
            {
                ans += r - rr;
                r = rr;
            }
            else
            {
                ans += rl - l;
                l = rl;
            }
        }
    }
    return;
}

int main()
{
    while(scanf("%s", a) != EOF)
    {
    len = strlen(a);
    greedy();
    printf("%d\n", ans);
    }
    return 0;
}

你可能感兴趣的:(贪心)