构造回文数操作

    xiaoxiao2022-06-27  52

    如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如: {1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,  {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。 现在给出一个数字序列,允许使用一种转换操作: 选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。 现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。
    输入描述:
    输入为两行,第一行为序列长度n ( 1 ≤ n ≤ 50) 第二行为序列中的n个整数item[i] (1 ≤ iteam[i] ≤ 1000),以空格分隔。
    输出描述:
    输出一个数,表示最少需要的转换次数
    输入例子:
    4 1 1 1 3
    输出例子:

    2

    思路:每次只考虑数列的首尾即可,序列用(a0,a1,,,an-1)表示,如果首尾相等那么就是对(a1,a2,,,,an-2)在进行判断。首尾不等的时候有两种情况,首部小,那么就将首部的临近两个相加,操作数加一,并对(a2,a3,,,an-1)在进行判断;尾部小,那么将尾部的两个元素相加,操作数加一,并对(a1,a2,,,,an-2)进行判断。

    int GetCnt(int *arr, int len) { int front = 0;//数组之首 int end = len - 1;//数组尾 int count = 0; //对比数组首尾,如果相等那么就去掉队首队尾 while (front < end) { if (arr[front] < arr[end]) { arr[front + 1] += arr[front]; front++; count++; } else if (arr[front]>arr[end]) { arr[end - 1] += arr[end]; end--; count++; } else { front++; end--; } } return count; }

    转载请注明原文地址: https://ju.6miu.com/read-1124115.html

    最新回复(0)