贪心算法-排队问题-JAVA

自己最近在学一些算法,试着把网上的贪心算法的例题编出来,JAVA版。


【题目描述】

 在一个医院B 超室,有n个人要做不同身体部位的B超,已知每个人需要处理的时间为ti,(0<i<=n),请求出一种排列次序,使每个人排队等候时间总和最小。

输入数据:第1行一个正整数n(你<=10000》,第2行有n个不超过 1000的正整数ti.

输出要求:n个人排队时间最小总和。

输入输出样例

输入:4

5 10 8 7

输出:

67


【算法分析】

本题贪心算法:n个人时间从小到大排序,就是这n个人最佳排队方案。求部分和的和即为所求。

反证法证明:假设有最优解序列:s1,s2sn,如s1不是最小的Tmin,不妨设sk=Tmin,将s1与sk对调,显然,对sk之后的人无影响,对sk之前的人等待都减少了,(s1-sk)>0,从而新的序列比原最优序列好,这与假设矛盾,故s1为最小时间,同理可证s2sn依次最小。


import java.util.Scanner;


public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int[] n = new int[N];
		int output = 0;
		for (int i = 0; i < N; i++) {
			n[i] = sc.nextInt();
		}
		for (int i = 0; i < N; i++) {
			for (int j = i+1; j < N; j++) {
				if(n[j]<n[i]){
					int temp = n[j];
					n[j] = n[i];
					n[i] = temp;
				}
			}
		}
		for (int i = 0; i < N; i++) {
			output += n[i]*(N-i);
		}
		System.out.println(output);
	}
}


阅读更多
换一批

没有更多推荐了,返回首页