试题 算法提高 排队接水1

文章讨论了如何使用C++、Java和Python实现一个算法,以找到使N个人在接水排队时平均等待时间最短的顺序。涉及数据结构如优先级队列和时间复杂度分析。
摘要由CSDN通过智能技术生成

资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

  有N个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得N个人的平均等待时间最小。

输入格式

  输入文件:共两行,每一行为N,第二行表示第1至N个人每人的接水时间Ti。

输出格式

  输出文件:两行,每一行为一种排队顺序,即1到N的一种排列;第二行为这种排列下的平均等待时间。(精确到小数点后两位)

样例输入

10
56 12 1 99 1000 234 33 55 99 812

样例输出

3 2 7 8 1 4 9 6 10 5
291.90

数据规模和约定

  n<=1000
  0<=Ti<=100

import java.awt.List;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		int[] s=new int[n];
		int[] f=new int[n];//用于标记,标记是否用过。
		int[] w=new int[n];;//表示等待的时间。 
		for(int i=0;i<s.length;i++)
			s[i]=scanner.nextInt();
		int min=0;
		int minj=0;
		int sum=0;
		for(int i=0;i<n;i++) {
			//进行循环n次
				for(int j=0;j<n;j++) {
					if(f[j]==0) {
						min=s[j];
						minj=j;
						break;
					}
				}
				for(int j=minj+1;j<n;j++) {
					if(s[j]<min&&f[j]==0) {
						min=s[j];
						minj=j;
					}
				}
			//System.out.print((minj+1)+" ");
			f[minj]=1;
			w[minj]=sum;
			sum+=min;
		}
		int num=0;
		for(int i=0;i<w.length;i++)
			num+=w[i];
		//System.out.println();
		//System.out.println(num);
		double kk=(double)num/n;
		System.out.printf("%.2f",kk);
	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值