自己最近在学一些算法,试着把网上的贪心算法的例题编出来,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,s2…sn,如s1不是最小的Tmin,不妨设sk=Tmin,将s1与sk对调,显然,对sk之后的人无影响,对sk之前的人等待都减少了,(s1-sk)>0,从而新的序列比原最优序列好,这与假设矛盾,故s1为最小时间,同理可证s2…sn依次最小。
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);
}
}