此题为洛谷普及试炼场的一道水题。。。。
题目链接:https://www.luogu.org/problem/show?pid=1223
题目描述
有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。
输入输出格式
输入格式:
输入文件共两行,第一行为n;第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。
输出格式:
输出文件有两行,第一行为一种排队顺序,即1到n的一种排列;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
输入输出样例
输入样例#1:
10 56 12 1 99 1000 234 33 55 99 812
输出样例#1:
3 2 7 8 1 4 9 6 10 5 291.90
说明
n<=1000
ti<=1e6,不保证ti不重复
分析:
嗯。。。。题目意思就是让一些人去接水,有的人水瓶大,接满花的时间多,有的人花的时间少 ,现在问怎么排队,才能使平均接水等待时间最少。。。那么我们知道总共的等待时间是第一个人的时间一直加到第n个人,那么就可以先让时间少的去打,这样就可以知道花的时间最少。。。。
那么题目中最多有1000个人,并且其中的ti不重复,那么我们就可以用一个1e6的桶来装数据(用于输出顺序),然后再求出平均时间;
代码:
#include<cstdio> #include<algorithm> #include<iostream> using namespace std; int n,f[1000010],data[1010]; double tot,cnt; int main(){ cin>>n; for(int i=1;i<=n;i++){ int a; cin>>a; data[i]=a; f[a]=i; } for(int i=0;i<=1000000;i++) if(f[i]) cout<<f[i]<<" "; cout<<endl; sort(data+1,data+1+n); for(int i=1;i<=n;i++){ cnt+=data[i-1]; cnt/=n; tot+=cnt; cnt*=n; } printf("%.2lf\n",tot); }
时间: 2024-10-25 16:40:16