排队接水

C++语言 码拜 9年前 (2016-04-09) 1956次浏览
题目描述
有n个人在一个水龙头前排队接水,假设每个人接水的时间为t[i],请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。
注意:若两个人的等待时间相同,则序号小的优先。
输入格式
第一行为n。
第二行到最后一行中,共有n个整数,
分别表示第一个人到第n个人每人的接水时间t[1],t[2],t[3],t[4],……t[n],每个数据之间有一个空格或换行。
数据范围: 0<n<=900, 0<t<=1000
输出格式
共两行,第一行为一种排队顺序,即1到n的一种排列;第二行为这种排列方案下的平均等待时间(保留到小数点后第二位)。

#include <iostream>
using namespace std;
int n;
int *time1;
int *order;
int bubble()
{
	for(int x=0;x<n;x++)
	{
		for(int y=n-1;y>=x;y--)
		{
			if(time1[y]<time1[x])
			{
			 	swap(time1[x],time1[y]);
				swap(order[x],order[y]);
			}
		}
	}
}
main()
{
	double aver=0;

	cin>>n;
	time1=new int[n];
	order=new int[n];
	for(int i=0;i<n;i++)
	{

		cin>>time1[i];
		order[i]=i+1;

	}
	bubble();
	for(int i=0;i<n-1;i++)
	{
		cout<<order[i]<<" ";
		aver+=time1[i]*(n-i-1);
	}

	cout<<order[n-1];

	aver/=n;
	cout<<endl<<aver<<endl;
	/*
	for(int i=0;i<n;i++)
	{
		cout<<time1[i]<<" ";

	}
	*/
 }

冒泡写得应该没有错,但是测试出来就是不对,不知道为什么,求指点

解决方案

40

注意:若两个人的等待时间相同,则序号小的优先。
这说明,你需要一个稳定的排序算法。
http://blog.csdn.net/jiange_zh/article/details/50704604
http://blog.csdn.net/hkx1n/article/details/3922249
一般认为冒泡是稳定的,但你写的这个不是。
试试这个输入
3
2 1 1
再试试这个
3
2 2 1

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明排队接水
喜欢 (0)
[1034331897@qq.com]
分享 (0)