P1223 排队接水
题目描述
有 n个人在一个水龙头前排队接水,假如每个人接水的时间为 T_i,请编程找出这 n个人排队的一种顺序,使得 n个人的平均等待时间最小。
输入格式
第一行为一个整数 n。
第二行 n个整数,第 i个整数 T_i 表示第 i个人的等待时间 T_i。
输出格式
输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
题解
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = Integer.parseInt(scan.nextLine());
String[] str= scan.nextLine().split(" ");
scan.close();
List<N> list = new ArrayList<>();
double arg = 0.0;
for(int i=0;i<str.length;i++) {
list.add(new N(i+1,Integer.parseInt(str[i])));
}
Collections.sort(list);
for(int i=0;i<list.size();i++) {
System.out.print(list.get(i).id+" ");
if(i!=list.size()-1)
arg+=list.get(i).time*(n-i-1);
}
System.out.println();
System.out.printf("%.2f",arg/n);
}
}
class N implements Comparable<N>{
public int id;
public int time;
public N(int id,int time) {
this.id=id;
this.time=time;
}
@Override
public int compareTo(N o) {
if(this.time>=o.time) {
return 1;
}else {
return -1;
}
}
@Override
public String toString() {
return "N [id=" + id + ", time=" + time + "]";
}
}