标签:一个 open bit ++ += n+1 format space 简单
【Problem description】
有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti(<=100),请编程找出这n(<=10000)个人排队的一种顺序,使得n个人的平均等待时间最小。
【Input format】
共两行,第一行为n;第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。
【Output format】
平均等待时间(输出结果精确到小数点后两位)。
【Algorithm design】
贪心算法
【Problem analysis】
统筹学,很简单的线性贪心。
T=t*i,要让接水时间较长的人接水时等待的人尽可能少。
为什么?假设有两个相邻的人a,b,且ta>tb,剩下的总人数为S
两个人接完水所有人花的总时间为ta*(s-1)+tb*(s-2)
若两人交换,总时间为tb*(s-1)+ta*(s-2)
因为ta>tb,所以很明显,法二更为优越,同理推广到全体
得证:按等水时间从小到大排序最优
【Source code】
#include <bits/stdc++.h>
using namespace std;
int n,t[10010];
double ans;
int main()
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
cin>>t[i];
sort(t+1,t+n+1);//时间排序
for(int i=1;i<=n;i++)
ans+=t[i]*(n-i);//将所有人等水时间累加
printf("%.2lf\n",ans/n);
return 0;
}
标签:一个 open bit ++ += n+1 format space 简单
原文地址:https://www.cnblogs.com/qswx/p/9308793.html