codeforces 985C Liebig's Barrels
题意:
有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。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1e5 + ;
long long a[N];
int main()
{
int n,k;
long long l;
scanf("%d%d%lld",&n,&k,&l);
for (int i = ;i < n * k;i++) scanf("%lld",&a[i]);
sort(a,a+n*k);
//printf("%lld\n",a[0] + l);
int pos = upper_bound(a,a+n*k,a[] + l) - a;
pos--;
//printf("%d\n",pos);
if (pos < n - ) puts("");
else
{
long long ans = ;
int sum = pos + ;
if (sum == n)
{
for (int i = ;i < n;i++) ans += a[i];
}
else
{
if (k == )
{
for (int i = ;i < n;i++) ans += a[i];
}
else
{
int c = (sum - n) / (k - );
int r = (sum - n) % (k - );
if (r)
{
for (int i = ;i <= c;i++)
{
ans += a[i*k];
}
n -= c + ;
for (int i = k * c + r + ;i <= pos;i++)
{
if (n == ) break;
ans += a[i];
n--;
}
}
else
{
for (int i = ;i < c;i++)
{
ans += a[i*k];
}
n -= c;
for (int i = k * c;i <= pos;i++)
{
if (n == ) break;
ans += a[i];
n--;
}
}
}
}
printf("%lld\n",ans);
}
return ;
}
codeforces 985C Liebig's Barrels的更多相关文章
- codeforces 985C Liebig's Barrels(贪心)
题目 题意: 有n * k块木板,每个木桶由k木板组成,每个木桶的容量定义为它最短的那块木板的长度. 任意两个木桶的容量v1,v2,满足|v1-v2| <= d. 问n个木桶容量的最大的和为多少 ...
- codeforce 985C Liebig's Barrels(贪心+思维)
Liebig's Barrels time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- 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 ...
- CF985C Liebig's Barrels 贪心 第二十
Liebig's Barrels time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Liebig's Barrels CodeForces - 985C (贪心)
链接 大意:给定$nk$块木板, 要制作$n$个$k$块板的桶, 要求任意两桶容积差不超过$l$, 每个桶的容积为最短木板长, 输出$n$个桶的最大容积和 假设最短板长$m$, 显然最后桶的体积都在$ ...
- C. Liebig's Barrels
You have m = n·k wooden staves. The i-th stave has length ai. You have to assemble nbarrels consisti ...
- Educational Codeforces Round 44 (Rated for Div. 2)
题目链接:https://codeforces.com/contest/985 ’A.Chess Placing 题意:给了一维的一个棋盘,共有n(n必为偶数)个格子.棋盘上是黑白相间的.现在棋盘上有 ...
- 【codeforces 768F】 Barrels and boxes
http://codeforces.com/problemset/problem/768/F (题目链接) 题意 A,B两种物品可以装到栈中,每个栈只能存放一种物品,容量没有限制.现在讲所有栈排成一列 ...
- 【codeforces 768F】Barrels and boxes
[题目链接]:http://codeforces.com/problemset/problem/768/F [题意] 让你把f个food和w个wine装在若干个栈里面; 每个栈只能装food或者是wi ...
随机推荐
- 【53】java的多线程同步剖析
synchronized关键字介绍: synchronized锁定的是对象,这个很重要 例子: class Sync { public synchronized void test() { Syste ...
- iOS视频播放Demo VideoPlayerDemo
VideoPlayerDemo https://github.com/CaliosD/VideoPlayerDemo 一个视频播放的例子,使用了pod.
- Nginx + IIS实现负载均衡 Session多站点共享
日子过得太索然无味了,研究了一下,所谓的负载均衡(主要是windows服务器IIS下的).先看看分析图:环境:linux服务器: centos 6.3windows服务器: windows serve ...
- 学习ASP.NET Core Razor 编程系列八——并发处理
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- HTML5的canvas标签制作黑客帝国里的简单画面
1.加入canvas标签 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> ...
- 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework
前言 一直以来写的博文都是比较温婉型的博文,今天这篇博文算是一篇批判性博文,有问题欢迎探讨,如标题,你到底会不会用EntityFramework啊. 你到底会不会用EntityFramework啊 面 ...
- 我对Spring的理解。
1.Spring实现了工厂模式的工厂类(在这里有必要解释清楚什么是工厂模式),这个类名为BeanFactory(实际上是一个接口),在程序中通常BeanFactory的子类ApplicationCon ...
- sqlServer遇到的问题
重置自增列:dbcc checkident(表名,reseed,数字(初始值))
- 【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象
不完整的抽象 抽象未支持所有互补或相关的方法时,将导致这种坏味. 为什么要有完整的抽象? 一种重要的抽象实现手法是创建内聚而完整的抽象.抽象未支持相关的方法时,可能会影响抽象的内聚性和完整性.如果抽象 ...
- ffmpeg 时间戳处理
视频的显示和存放原理 对于一个电影,帧是这样来显示的:I B B P.现在我们需要在显示B帧之前知道P帧中的信息.因此,帧可能会按照这样的方式来存储:IPBB.这就是为什么我们会有一个解码时间戳和一个 ...