题目详情:
Description
有 n 个人在一个水龙头前排队接水,假如每个人接水的时间为 Ti,请编程找出这 n 个人排队的一种顺序,使得 n 个人的平均等待时间最小。(接水时间相同的人中,原来排在前面的还应该排在前面)。
Format
Input
输入文件共两行,第一行为 n(小于 1000);第二行分别表示第 1 个人到第 n 个人每人的接水时间 T1,T2,…,Tn(均为 int 型整数),每个数据之间有 1 个空格。
Output
输出文件有两行,第一行为一种排队顺序,即 1 到 n 的一种排列;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
Samples
输入数据 1
10
56 12 1 99 1000 234 33 55 99 812
输出数据 1
3 2 7 8 1 4 9 6 10 5
532.00
Limitation
1s, 1024KiB for each test case.
题解:
很明显,这就是一道使需要时间最短往前排的贪心水题,因为题目要求要使所有人的等待时间最短。知道了这些再开始贪心就轻松多了,需要注意的是最后的计算是小数类型,所以答案变量的类型是double且所有运算过程都要强制类型转换或在除以时先乘1.0,在最后也要记得保留两位小数。
程序:
#include<bits/stdc++.h>
using namespace std;
struct N{
int t,id;
}a[1010];
bool cmp(N x,N y){
if(x.t!=y.t)
return x.t<y.t;
return x.id<y.id;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].t;
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
cout<<a[i].id<<" ";
double k=a[1].t,ans=0;
for(int i=2;i<=n;i++){
ans+=k;
k+=a[i].t;
}
cout<<endl<<fixed<<setprecision(2)<<(double)ans/n;
return 0;
}
—————————————————— 分 割 线—————————————————————
推销一下我的另两篇博客
一篇写的是背包问题 --->戳开有惊喜!
另一篇写的是c++常用头文件汇总 --->戳开有惊喜!
希望大佬们能支持一下