题目描述
有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的一种排列;第二行为这种排列方案下的平均等待时间(保留到小数点后第二位)。
有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
这说明,你需要一个稳定的排序算法。
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