贪心算法_排队接水_C++_1319:【例6.1】

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

【输入】
共两行,第一行为n(1≤n≤1000);第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。

【输出】
有两行,第一行为一种排队顺序,即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

C++代码:

// 
#include<bits/stdc++.h>
using namespace std;
//利用结构体排序
struct Person{
	int t;//接水时间
	int no;//序号
}a[1005];
//结构体排序cmp函数
bool cmp(Person p1,Person p2){
	return p1.t<p2.t;
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].t;
		a[i].no=i;
	}
	double sum=0;
	sort(a+1,a+1+n,cmp);//结构体排序
	for(int i=1;i<=n;i++){
		cout<<a[i].no<<' ';
		sum+=a[i].t*(n-i);//需要的总时间
	}
	printf("\n%.2lf",sum/n);
}
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐