Time Limit: 3 second
Memory Limit: 2 MB

有n个人排队到r个水龙头去打水,他们装满水桶的时间t1,t2,....tn为整数且各不相等,应如何安排他们的打水顺序才能使他们花费的总时间最少。

Input

输入文件两行
第一行输入打水人数n,水龙头数r。用空格隔开
第二行依次输入n个人的打水时间t1,t2,....tn,用空格隔开(1≤n≤1000)。

Output

输出总共花费的时间。(最后用换行结束)

Sample Input

4 2
2 6 4 5

Sample Output

23

【题解】

样例的取法

2 4 5 6

注意只有两个水龙头

先每个人都等2个单位 ->8

0 2 5 6

再每个人都等两个单位 这下只有3个人等了 -> 6

0 0 3 6

再每人等3个单位 这下只有2个人等了 -> 6

0 0 0 3

最后一个人再等3个单位,->3

总共23个单位.

贪心法,每次装水的时候先让花费时间少的人先装,这样其他所有人都在等,他们等的时间就会比较少,而这个花费时间少的人打完之后,一起等的人就变成N-1个了,剩下的时间可能比较长,但是人数变少了,肯定比n个人一起等时间长的花费时间来得短。先排序,然后用几个变量作为头尾不断减就好。

【代码】

#include <cstdio>const int MAXN = 1000;int n,r,a[MAXN*10+100],sum = 0,num;void input_data() //输入数据
{for (int i = 1;i <= MAXN*10;i++) //先置0 这可以作为跳出循环的边界a[i] = 0;scanf("%d %d",&n,&r);for (int i = 1;i <= n;i++)scanf("%d",&a[i]);num = n; //num没用到。
}void kp(int l,int r) //快排一遍。 从小到大排
{int i = l,j = r,m = a[(i+j)/2];do{while (a[i] < m) i++;while (m < a[j]) j--;if (i <= j){int t = a[i];a[i] = a[j];a[j] = t;i++;j--;}}while (i <= j);if (l < j) kp(l,j);if (i < r) kp(i,r);
}void get_ans()
{int i = 1,j = 1 + r -1; //这是头尾指针 要注意超过n变成n 这里的头尾指的是能在有限的水龙头上打水的人。if (j > n) j = n;while (a[i] > 0) //如果还有东西可以减 那么。。{int d = a[i]; //先获取要花费的时间(取最短时间)for (int k = i;k <= j;k++) //水龙头上的人每个人都减少一些时间a[k]-=d;for (int k = i;k <= n;k++) //每个在等的人都增加时间。sum+=d;while (a[i] == 0 && i<=n ) i++; //找下一个在等的人。j = i + r -1;if (j > n) j = n;}
}void output_ans()
{printf("%d\n",sum);
}int main()
{input_data();kp(1,n);get_ans();output_ans();return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7632471.html

【2030】排队打水问题相关推荐

  1. P1223 排队接水

    题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入格式 输入文件共两行,第一行为n:第二行分别表示第1个人到第 ...

  2. 洛谷——P1223 排队接水

    题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入文件共两行,第一行为n:第二行分别 ...

  3. 17行代码AC_51Nod - 2133 排队接水(贪心)

    励志用少的代码做高效表达 贪心算法模板题 贪心算法简单来讲即自顶向下,求解出每个子最优解,且每个子问题不会对下一个问题产生影响 题意:n个人排队接水,问如何排序才能使总等待时间最短,(正在接水的人和没 ...

  4. 信息学奥赛一本通 1319:【例6.1】排队接水 | 洛谷 P1223 排队接水

    [题目链接] ybt 1319:[例6.1]排队接水 洛谷 P1223 排队接水 [题目考点] 1. 贪心 2. 贪心选择性质的证明 要想证明贪心选择可以得到最优解,只需要证明最优解包含每一次的贪心选 ...

  5. 信息学奥赛一本通(1319:【例6.1】排队接水)

    1319:[例6.1]排队接水 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 17332     通过数: 7890 [题目描述] 有n个人在一个水龙头前排队接水 ...

  6. 排队接水(信息学奥赛一本通-T1319)

    [题目描述] 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. [输入] 共两行,第一行为n(1≤n≤1000):第二行分别 ...

  7. 排队接水(洛谷-P1223)

    题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入共两行,第一行为n:第二行分别表示 ...

  8. 算法提高 排队打水问题 无聊刷个水题

    算法提高 排队打水问题 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 有n个人排队到r个水龙头去打水,他们装满水桶的时间t1.t2---..tn为整数且各不相等,应如何安排他们的打 ...

  9. AcWing 913. 排队打水 (排序不等式)

    AcWing 913. 排队打水 有 n n n 个人排队到 1 1 1 个水龙头处打水,第 i i i 个人装满水桶所需的时间是 t i t_{i} ti​,请问如何安排他们的打水顺序才能使所有人的 ...

  10. [ZCMU OJ]5252: 英雄卡/5253: 排队接水/5254: 颜色叠加/5255: 勤劳的老杨/5256: 秘密大厦的访客

    5252: 英雄卡 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 133  Solved: 12 [Submit][Status][Web Board ...

最新文章

  1. Python中re的match、search、findall、finditer区别正则
  2. 数据安全(主从复制)
  3. .net core 技术栈 网站收集
  4. Office PPT如何切换到返回幻灯片
  5. 曾经想学很多很多,最后发现自己只能专心学那么很少的几个必杀技
  6. 下拉框_jQuery 美化界面的下拉框
  7. 前端学习(1972)vue之电商管理系统电商系统之弹出修改对话框
  8. C语言 输入的注意事项 EOF的应用
  9. 一张图概括淘宝直播背后的前端技术 | 赠送多媒体前端手册
  10. 苹果手机升级后开不了机怎么办_iPhone8突然黑屏开不了机怎么办?西安苹果售后维修点教你这样解决...
  11. 3D全景技术打造三维数字化虚拟博物馆
  12. vue一维码,二维码生成
  13. word2010自动弹出信息检索解决方法
  14. java中类成员,java中类成员的限定词
  15. CCF小白刷题之路---201809-1 卖菜(C/C++ 100分)
  16. java json设置编码_java-JSON字符编码
  17. poj3104(二分判断可行性)
  18. pion实现录制WebRTC流
  19. 特斯拉Tesla Model 3整体架构解析
  20. 微信扫描登录(生成二维码)

热门文章

  1. C++ 使用其它文件的类
  2. 区块链 怎么设置区块最大交易容量
  3. 比特币 出块速度多少 为什么每秒7笔 以太坊15TPS
  4. 微信小程序云开发教程-微信小程序的API入门-API的类型和语法结构
  5. linux ubuntu php7.0 安装 curl
  6. java gc loggc_java9中gc log参数迁移
  7. 图(二):图的邻接矩阵表示
  8. Swagger2 忽略某些参数使其不出现在接口文档中
  9. java基础总结02-语言基础
  10. mysql/mariadb 安装开启spinx引擎