当前位置: 首页 > news >正文

【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

相关文章:

  • vue入门到启动_Vue入门:Vue项目创建及启动
  • 【2012】建立二维矩阵
  • idle显示出错信息 python_python小课堂05 - 基本数据类型字符串篇(重要)
  • POJ3468(线段树 区间修改 lazy-tag)
  • html radio 默认图片替换_怎么修改单选框radio默认样式
  • ubuntu 16.04 主题美化及终端美化
  • android怎么监听多点触摸_android 多点触控
  • c#webservice接口調用_用.net发布一个简单的webservice
  • 51nod1967 路径定向(欧拉回路+结论题)
  • python管道函数_python--管道, 事件, 信号量, 进程池
  • 数据挖掘的好书_大数据挖掘分析经典书籍推荐
  • 第2次作业:随随便便又是一个响响亮亮的标题!
  • 解构给默认值_ES6(二):展开运算符、解构、class
  • 路由知识 静态路由 rip eigrp ospf
  • cad偏移后自动变色lisp_高手帮忙修改,批量偏移 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
  • [PHP内核探索]PHP中的哈希表
  • SegmentFault for Android 3.0 发布
  • Android单元测试 - 几个重要问题
  • canvas 高仿 Apple Watch 表盘
  • css属性的继承、初识值、计算值、当前值、应用值
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • React-flux杂记
  • ReactNativeweexDeviceOne对比
  • spark本地环境的搭建到运行第一个spark程序
  • STAR法则
  • 闭包--闭包之tab栏切换(四)
  • 给初学者:JavaScript 中数组操作注意点
  • 记录一下第一次使用npm
  • 前端面试总结(at, md)
  • 人脸识别最新开发经验demo
  • 实现菜单下拉伸展折叠效果demo
  • 微服务入门【系列视频课程】
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 责任链模式的两种实现
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • puppet连载22:define用法
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​用户画像从0到100的构建思路
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #QT(串口助手-界面)
  • $(function(){})与(function($){....})(jQuery)的区别
  • (2)(2.10) LTM telemetry
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (四)汇编语言——简单程序
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • .gitignore文件—git忽略文件
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET CORE Aws S3 使用
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET开源快速、强大、免费的电子表格组件
  • .考试倒计时43天!来提分啦!
  • @ModelAttribute注解使用
  • @private @protected @public
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku