牛客网-回文序列(网易)

题目描述

如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如: {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),以空格分隔。

输出描述:

输出一个数,表示最少需要的转换次数
示例1

输入

4
1 1 1 3

输出

2

//思路:使用两个指针,初始时,一个指向第一个元素,一个指向最后一个元素
//(1)若两个元素相等,left++,right--;
//(2)若前面元素小于后面元素,求前面一个元素和其相邻元素的和,此时left++,right不发生变化
//(3)若前面元素大于后面元素,求后面一个元素和其相邻元素的和,此时right--,left不发生变化
#include<iostream>
using namespace std;
int Numofxchange(int item[],int n){
    int num=0;
    int left=0,right=n-1;
    while(left<right){
        if(item[left]<item[right]){
            num++;
            left++;
            item[left]=item[left]+item[left-1];
        }
        else if(item[left]>item[right]){
            num++;
            right--;
            item[right]=item[right]+item[right+1];
        }
        else{
            left++;
            right--;
        }
    }
    return num;
}
int main(){
    int n,item[1000];
    while(cin>>n){
        for(int i=0;i<n;++i)
            cin>>item[i];
    }
    int result=Numofxchange(item,n);
    cout<<result<<endl;
    system("pause");
    return 0;
}


总结:一定要考虑前后元素的大小关系!!!不然通过率只有70%

原文地址:https://www.cnblogs.com/rgly/p/7422502.html