洛谷 试炼场 P1233 排队接水 (排序,贪心)

一道水题。。。。

链接: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不重复

 

分析:

题目很水,大概意思就是一群人去接水,有的人要的时间多,而有的人要的时间少,问怎样排队平均等待时间最少?

那我们知道总的等待时间是第一个时间加到最后一个人,所以要让时间少的先打,总的等待时间最少。

代码:

 1 #include<bits/stdc++.h>                           //c++万能头文件
 2 using namespace std;
 3 struct sb{
 4     int a;
 5     int id;
 6 }s[10086]; 
 7 int cmp(sb a1,sb a2){
 8     if(a1.a>a2.a) return 0;
 9     if(a1.a<a2.a) return 1;
10 }                                                                 //因为用了struct所以要定义怎样排序
11 int main(){
12     int n;
13     double z;
14     cin>>n;
15     for(int i=1;i<=n;i++){
16         cin>>s[i].a;                            //输入接水所用时间
17         s[i].id=i;                               //给当前接水人的的编号
18     }
19     sort(s+1,s+n+1,cmp);
20     for(int i=1;i<=n;i++){
21         cout<<s[i].id<<" ";                //输出接水的顺序
22         z=z+s[i].a*(n-i);                    //计算总时间
23     }
24     printf("\n%.2f",z/n);                            //输入平均时间
25     return 0;
26 }

 

posted @ 2016-12-27 12:02  59s  阅读(672)  评论(0编辑  收藏  举报