题意:

有n * k块木板,每个木桶由k木板组成,每个木桶的容量定义为它最短的那块木板的长度。

任意两个木桶的容量v1,v2,满足|v1-v2| <= d。

问n个木桶容量的最大的和为多少,或者说明不可能做出这样的n个木桶。

思路:

贪心

要满足|v1-v2| <= d,那么就要满足最大的木桶容量和最小的木桶容量的差小于等于d。

所以先把木板长度排序,如果a[0] 到 a[0] + d这个范围内有大于等于n个木板,那么就存在合理的分配方案,因为可以把至少n个木板作为最短的木板。

然后就计算最大的和,如果a[0] 到 a[0] + d这个范围内刚好有n块木板,那么最大的和就是这n块木板长度的和;

如果大于n的话,那么就要考虑让每个木桶最小木板的长度尽可能的大,就是让每个最小木板尽选择数组后面的数字。

因为1块木板可以支配k - 1块木板,所以下一个木桶的最小长度就可以从a[k]开始,这样就让最小的尽量大了。

一个木板可以覆盖的区间长度是k,假设a[0] 到 a[0] + d这个范围内有sum块木板,那么多余的木板就是res = sum - n。

区间数量就是c = res / (k-1),设r = res % (k - 1),

当r = 0,那么就有c个完整的区间,前c个木桶的长度就是0*k,1*k,2*k . . . (c-1)*k,后n - c个木桶的容量的下标就从c * k到sum-1;

当r != 0,有c个完整的区间和一个不完整的区间,前c + 1个木桶的容量就是0 * k,1 * k,2 * k . . . c * k,后n - c - 1个木桶的容量的下标就从c * k + r + 1到sum - 1。

代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N = 1e5 + ;
  6. long long a[N];
  7. int main()
  8. {
  9. int n,k;
  10. long long l;
  11. scanf("%d%d%lld",&n,&k,&l);
  12. for (int i = ;i < n * k;i++) scanf("%lld",&a[i]);
  13. sort(a,a+n*k);
  14. //printf("%lld\n",a[0] + l);
  15. int pos = upper_bound(a,a+n*k,a[] + l) - a;
  16. pos--;
  17. //printf("%d\n",pos);
  18. if (pos < n - ) puts("");
  19. else
  20. {
  21. long long ans = ;
  22. int sum = pos + ;
  23. if (sum == n)
  24. {
  25. for (int i = ;i < n;i++) ans += a[i];
  26. }
  27. else
  28. {
  29. if (k == )
  30. {
  31. for (int i = ;i < n;i++) ans += a[i];
  32. }
  33. else
  34. {
  35. int c = (sum - n) / (k - );
  36. int r = (sum - n) % (k - );
  37. if (r)
  38. {
  39. for (int i = ;i <= c;i++)
  40. {
  41. ans += a[i*k];
  42. }
  43. n -= c + ;
  44. for (int i = k * c + r + ;i <= pos;i++)
  45. {
  46. if (n == ) break;
  47. ans += a[i];
  48. n--;
  49. }
  50. }
  51. else
  52. {
  53. for (int i = ;i < c;i++)
  54. {
  55. ans += a[i*k];
  56. }
  57. n -= c;
  58. for (int i = k * c;i <= pos;i++)
  59. {
  60. if (n == ) break;
  61. ans += a[i];
  62. n--;
  63. }
  64. }
  65. }
  66. }
  67. printf("%lld\n",ans);
  68. }
  69. return ;
  70. }

codeforces 985C Liebig's Barrels的更多相关文章

  1. codeforces 985C Liebig's Barrels(贪心)

    题目 题意: 有n * k块木板,每个木桶由k木板组成,每个木桶的容量定义为它最短的那块木板的长度. 任意两个木桶的容量v1,v2,满足|v1-v2| <= d. 问n个木桶容量的最大的和为多少 ...

  2. codeforce 985C Liebig's Barrels(贪心+思维)

    Liebig's Barrels time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  3. Codeforce Div-2 985 C. Liebig's Barrels

    http://codeforces.com/contest/985/problem/C C. Liebig's Barrels time limit per test 2 seconds memory ...

  4. CF985C Liebig's Barrels 贪心 第二十

    Liebig's Barrels time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  5. Liebig's Barrels CodeForces - 985C (贪心)

    链接 大意:给定$nk$块木板, 要制作$n$个$k$块板的桶, 要求任意两桶容积差不超过$l$, 每个桶的容积为最短木板长, 输出$n$个桶的最大容积和 假设最短板长$m$, 显然最后桶的体积都在$ ...

  6. C. Liebig's Barrels

    You have m = n·k wooden staves. The i-th stave has length ai. You have to assemble nbarrels consisti ...

  7. Educational Codeforces Round 44 (Rated for Div. 2)

    题目链接:https://codeforces.com/contest/985 ’A.Chess Placing 题意:给了一维的一个棋盘,共有n(n必为偶数)个格子.棋盘上是黑白相间的.现在棋盘上有 ...

  8. 【codeforces 768F】 Barrels and boxes

    http://codeforces.com/problemset/problem/768/F (题目链接) 题意 A,B两种物品可以装到栈中,每个栈只能存放一种物品,容量没有限制.现在讲所有栈排成一列 ...

  9. 【codeforces 768F】Barrels and boxes

    [题目链接]:http://codeforces.com/problemset/problem/768/F [题意] 让你把f个food和w个wine装在若干个栈里面; 每个栈只能装food或者是wi ...

随机推荐

  1. 安卓学习笔记一 Activity延迟转跳实现欢迎界面

    新人学习安卓,为了刚好的学习,现做如下笔记..同时希望自己的经验可以帮助新人们学习入门. 几乎每个app都有个欢迎界面,我们可以使用Activity转跳来实现. 首先建立一个MainActivity ...

  2. C# 视频多人脸识别

    上一篇内容的调整,并按 @轮回 的说法,提交到git了,https://github.com/catzhou2002/ArcFaceDemo 基本思路如下: 一.识别线程 1.获取当前图片 2.识别当 ...

  3. ASP.NET Core 2.0 : 九.从Windows发布到CentOS的跨平台部署

    本文聊一下如何在Windows上用VS开发并发布, 然后将其部署到CentOS上.对于我们一些常在Windows上逛的来说,CentOS用起来还真有些麻烦.MSDN官方有篇文章大概讲了一下(链接),按 ...

  4. CSS3实现多样的边框效果

    半透明边框 实现效果: 实现代码: <div> 你能看到半透明的边框吗? </div> div { /* 关键代码 */ border: 10px solid rgba(255 ...

  5. IT轮子系列(三)——如何显示方法名——Swagger的使用(三)

    前言 在上一篇文章IT轮子系列(三)——如何给返回类型添加注释——Swagger的使用(二) 介绍如何使用swashbuckle的时候忽略了一个问题,就是默认创建的API项目在生成文档的时候是没有显示 ...

  6. 全局程序集缓存GAC

    GAC中的所有的Assembly都会存放在系统目录"%winroot%\assembly下面.放在系统目录下的好处之一是可以让系统管理员通过用户权限来控制Assembly的访问. 目录:C: ...

  7. Vector 特性

    1.Vector是一个连续内存占用的容器 2.每次Insert,都会将插入的对象先析构,然后复制一个副本添加到容器内 3.容器的大小先是1,然后是2,然后是4,也可以使用reserve来重新制定队列的 ...

  8. 基于RecyclerView的瀑布流实现

    fragment的布局: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...

  9. mysql distinct field1,field2,field3, .... from table

    mysql distinct field1,field2,field3, .... from table 我们知道 这样的sql可以去掉重复项 (field1的重复项); select distinc ...

  10. Powmod快速幂取模

    快速幂取模算法详解 1.大数模幂运算的缺陷: 快速幂取模算法的引入是从大数的小数取模的朴素算法的局限性所提出的,在朴素的方法中我们计算一个数比如5^1003%31是非常消耗我们的计算资源的,在整个计算 ...