码迷,mamicode.com
首页 > 其他好文 > 详细

【Queue for Water】排队接水

时间:2018-07-14 11:47:44      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:一个   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;

}

【Queue for Water】排队接水

标签:一个   open   bit   ++   +=   n+1   format   space   简单   

原文地址:https://www.cnblogs.com/qswx/p/9308793.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!