1.如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{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} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。
算法思想:如果左边小于右边,则把左边数和相邻的数相加,并把指针往后移动一位比较a[2],a[3]...a[n-1];否则,比较a[0]...a[n-2]
public class Huiwen {
/*如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。
*/
public static int fun(int n,int a[]){
int i=0;
int j=a.length-1;
int temp=0;
while(i<j){
if(a[i]<a[j]&&i<j) {
a[i+1]=a[i]+a[i+1];
i++;
temp++;
}
else if(a[i]>a[j]&&i<j){
a[j-1]=a[j]+a[j-1];
j--;
temp++;
}else {
i++;
j--;
}
}
return temp;
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
while(scanner.hasNext()){
int n=scanner.nextInt();
int a[]=new int[n];
for(int i=0;i<n;i++){
a[i]=scanner.nextInt();
}
System.out.println(fun(n, a));
}
}
}