题目描述
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。
{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
分析:
回文从两端看一一对应相等,所以从两端开始比较,有不相同的就将小者相邻元素相加。
用两个指针,分别指向开头和结尾,如果有前面的小,则将前面的元素和它后一个元素相加放到它后一个元素的位置,然后前指针后移一个继续判断。
如果后面元素大,则将后面元素和它前面一个元素相加放到它前面元素的位置。一直下去,到最后只有一个元素(是回文)位置。
import java.util.*; public class Main{ /* 用两个指针,分别指向开头和结尾,如果有前面的小,则将前面的元素和它后一个元素相加放到它后一个元素的位置,然后前指针后移一个继续判断。 如果后面元素大,则将后面元素和它前面一个元素相加放到它前面元素的位置。一直下去,到最后只有一个元素(是回文)位置。 */ public static void main(String[] args){ Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(); int[] num=new int[n]; for(int i=0;i<n;i++){ num[i]=sc.nextInt(); } int count=0; int start=0,end=n-1; while(start<end){ if(num[start]<num[end]){ num[start+1]=num[start]+num[start+1]; start++; count++; }else if(num[start]>num[end]){ num[end-1]=num[end]+num[end-1]; end--; count++; }else{ start++; end--; } } System.out.println(count); } } }