【2030】排队打水问题
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】排队打水问题相关推荐
- P1223 排队接水
题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入格式 输入文件共两行,第一行为n:第二行分别表示第1个人到第 ...
- 洛谷——P1223 排队接水
题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入文件共两行,第一行为n:第二行分别 ...
- 17行代码AC_51Nod - 2133 排队接水(贪心)
励志用少的代码做高效表达 贪心算法模板题 贪心算法简单来讲即自顶向下,求解出每个子最优解,且每个子问题不会对下一个问题产生影响 题意:n个人排队接水,问如何排序才能使总等待时间最短,(正在接水的人和没 ...
- 信息学奥赛一本通 1319:【例6.1】排队接水 | 洛谷 P1223 排队接水
[题目链接] ybt 1319:[例6.1]排队接水 洛谷 P1223 排队接水 [题目考点] 1. 贪心 2. 贪心选择性质的证明 要想证明贪心选择可以得到最优解,只需要证明最优解包含每一次的贪心选 ...
- 信息学奥赛一本通(1319:【例6.1】排队接水)
1319:[例6.1]排队接水 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 17332 通过数: 7890 [题目描述] 有n个人在一个水龙头前排队接水 ...
- 排队接水(信息学奥赛一本通-T1319)
[题目描述] 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. [输入] 共两行,第一行为n(1≤n≤1000):第二行分别 ...
- 排队接水(洛谷-P1223)
题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入共两行,第一行为n:第二行分别表示 ...
- 算法提高 排队打水问题 无聊刷个水题
算法提高 排队打水问题 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 有n个人排队到r个水龙头去打水,他们装满水桶的时间t1.t2---..tn为整数且各不相等,应如何安排他们的打 ...
- AcWing 913. 排队打水 (排序不等式)
AcWing 913. 排队打水 有 n n n 个人排队到 1 1 1 个水龙头处打水,第 i i i 个人装满水桶所需的时间是 t i t_{i} ti,请问如何安排他们的打水顺序才能使所有人的 ...
- [ZCMU OJ]5252: 英雄卡/5253: 排队接水/5254: 颜色叠加/5255: 勤劳的老杨/5256: 秘密大厦的访客
5252: 英雄卡 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 133 Solved: 12 [Submit][Status][Web Board ...
最新文章
- Python中re的match、search、findall、finditer区别正则
- 数据安全(主从复制)
- .net core 技术栈 网站收集
- Office PPT如何切换到返回幻灯片
- 曾经想学很多很多,最后发现自己只能专心学那么很少的几个必杀技
- 下拉框_jQuery 美化界面的下拉框
- 前端学习(1972)vue之电商管理系统电商系统之弹出修改对话框
- C语言 输入的注意事项 EOF的应用
- 一张图概括淘宝直播背后的前端技术 | 赠送多媒体前端手册
- 苹果手机升级后开不了机怎么办_iPhone8突然黑屏开不了机怎么办?西安苹果售后维修点教你这样解决...
- 3D全景技术打造三维数字化虚拟博物馆
- vue一维码,二维码生成
- word2010自动弹出信息检索解决方法
- java中类成员,java中类成员的限定词
- CCF小白刷题之路---201809-1 卖菜(C/C++ 100分)
- java json设置编码_java-JSON字符编码
- poj3104(二分判断可行性)
- pion实现录制WebRTC流
- 特斯拉Tesla Model 3整体架构解析
- 微信扫描登录(生成二维码)