随风


私信TA

用户名:Cyunliang

访问量:3080

签 名:

等  级
排  名 1644
经  验 2725
参赛次数 0
文章发表 6
年  龄 0
在职情况 学生
学  校 贵州商学院
专  业

  自我简介:

解题思路:没有什么特别的技巧,就是找特点,然后直接解题。通俗易懂。

                思路:因为每次能量聚合都是以 “ * ” 的形式进行的。而乘积的大小取决于因数的大小。所以,要想每次聚合的能量越多,参与聚合的头、尾标记就要尽可能的大。反之,只要先除去最小的标记,就能保证头、尾标记尽可能的大。故只要每次都以最小的标记为中心进行聚合,就会使得最小的标记最先被除去。从而得到能量聚合的最优顺序。

注意事项:每次聚合后,能量珠会少一颗。即可用数组长度要减1(对应代码中的m--)

参考代码:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();
		int[] a=new int[n];
		for(int i=0;i<n;i++)
			a[i]=input.nextInt();
		int sum=0;
		int m=a.length;
		while(m!=1)
		{
			//找最小值,并标记其下标
			int min=a[0];
			int min_xb=0;
			for(int i=1;i<m;i++)
				if(a[i]<min)
				{
					min=a[i];
					min_xb=i;
				}
			//确定最小值的前一个数
			int min_front;
			if(min_xb==0)
				min_front=a[m-1];
			else
				min_front=a[min_xb-1];
			//确定最小值的后一个数
			int min_behide;
			if(min_xb==m-1)
				min_behide=a[0];
			else
				min_behide=a[min_xb+1];
			//能量聚合
			sum+=min_front*min*min_behide;
			// System.out.println(min_front+"*"+min+"*"+min_behide); //查看每次能量聚合情况
			//删除最小值,形成新数组
			for(int i=min_xb;i<a.length-1;i++)
				a[i]=a[i+1];
			//每两个能量珠聚合,总能量珠数-1
			m--;
		}
		System.out.println(sum);
	}

}


 

0.0分

5 人评分

  评论区

  • «
  • »