网易2017秋招--1、回文序列

题目描述:
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{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
思路:首尾指针跟踪,两个数不相等就进行加法:小的数加上相邻的值;相等进行下一位置判断
 1 #include <iostream>
 2 using namespace std;
 3  
 4 int main()
 5 {
 6     int n;
 7     int result = 0;
 8     int count = 0;
 9     while(cin>>n)
10     {
11         int tmp[n];
12         for(int i=0;i<n;i++)
13         {
14             cin>>tmp[i];
15         }
16         int start = 0;
17         int end = n-1;
18         while(n>=2 && start<end)
19         {
20             //左边值小于右侧,左侧相邻相加放入左侧当前的下一位置
21             if(tmp[start]< tmp[end])
22             {
23                 result = tmp[start] +tmp[start+1];
24                 start++;
25                 tmp[start] = result;
26                 count++;
27             }
28             //左边值大于右侧,右侧相邻相加放入右侧当前的前一位置
29             else if(tmp[start]> tmp[end])
30             {
31                 result = tmp[end] +tmp[end-1];
32                 end--;
33                 tmp[end] = result;
34                 count++;
35             }
36             else//相等,进行下一位置判断
37             {
38                 start++;
39                 end--;
40             }
41         }
42         //出循环不用加额外判断原因,2种情况,一种左右相同归为最中间位置
43        //第二种情况,中间变为一个数或者最后只剩下一位数也可称之为回文
44         cout<<count<<endl;
45     }
46     return 0;
47 }

 

posted @ 2017-05-02 14:24  qqky  阅读(203)  评论(0编辑  收藏  举报