洛谷 P1223 排队接水

题目描述

有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不重复

当ti重复时,按照输入顺序即可(sort是可以的)

考察算法:快排,贪心                    难度:普及-

思路:因为要求平均值最小,所以应让用时少的先接水(可以用sort排)

   第二个人等了第一个人的时间,第三个人等了第一、二个人的时间.....以此类推,所以第 i 个人的时间要乘 n-i

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
struct s {
int id;
int time;
}m[];
int cmp(s x, s y) {
if(x.time == y.time) return x.id < y.id;
return x.time < y.time;
}
int main() {
// freopen("testdata(1).in","r",stdin);
double sum = ;
scanf("%d", &n);
for(int i = ; i <= n; i++) {
scanf("%d", &m[i].time);
m[i].id = i;
}
sort(m+, m++n, cmp);
for(int i = ; i <= n; i++) printf("%d ", m[i].id);
printf("\n");
for(int i = ; i < n; i++) sum += m[i].time * (n-i);
printf("%.2lf", 1.0*sum/n);
return ;
}

最新文章

  1. spring.net xml 命名空间
  2. IntelliJ IDEA 发布最新版本13.0.1
  3. java中有关线程的题目
  4. Multiple actions were found that match the request Web API
  5. ip routing&no ip routing
  6. phpcms 03
  7. 跟开涛老师学shiro -- 授权
  8. 获取本地ip地址
  9. “我爱淘”冲刺阶段Scrum站立会议5
  10. oracle 备份与还原 及相关操作
  11. VMware10.0.4下 CentOS 6.5 cmake安装 MySQL 5.5.32
  12. ios 以NSObject为父类的各类间继承关系
  13. 前端自动化学习笔记(一)——Yeoman,bower,Grunt的安装
  14. DELPHI中MessageBox的用法
  15. linux下编译安装nginx
  16. 观察者模式(Observer)发布、订阅模式
  17. javaWeb学习总结(8)- jsp指令(3)
  18. CRM模块
  19. VS2013编译Qt5.2.1 32位静态库debug-and-release版及结果分享
  20. 自定义适用于手机和平板电脑的 Dynamics 365(四):窗体脚本

热门文章

  1. 公司采购 流程flowable例子
  2. Django 框架篇(四) : 视图(view)详解 以及 路由系统(url)
  3. COGS 577 蝗灾 线段树+CDQ分治
  4. lslpp 总结
  5. SQLServer2008端口及防火墙设置
  6. Cisco交换机IOS配置介绍
  7. 在Ubuntu14.04中安装Py3和切换Py2和Py3环境
  8. 遇到的兼容性bug
  9. BZOJ3130: [Sdoi2013]费用流(二分,最大流)
  10. rev---将文件中的每行内容以字符为单位反序输出