codeforces 657C - Bear and Contribution [想法题]
题目链接: http://codeforces.com/problemset/problem/657/C
--------------------------------------------------------------------------------------------------------
题目的特别之处在于只有 $+1$ $+5$ 这两种操作 我们要考虑如何利用这个条件
多想一下后可以发现 如果最优解的目标值为$x($将至少$k$个人的值增加到$x)$
那么一定存在一个人 他的初始值在 $[x - 4, x]$ 这个范围内
否则将$x$减去$5$后可以得到更优的解
因此可能成为最优解的目标值最多只有 $n * 5$ 种
现在考虑的便是在 $O(n)$ 枚举目标值的前提下 如何对于每个目标值快速计算出答案
我一开始的想法是根据 $mod 5$ 的余数分类 写$5$个数组记录下前缀和什么的
然而这样二分答案有一个 $log$ 二分数组下标又一个 $log$
尽管题目给了 $4s$ 应该可以过 但是总感觉这样做不够优雅
再次分析题目条件我们有可以发现 实际上每次询问都是与目标距离最小的 $k$ 个数 而这个$k$是不变的
于是现在问题就变成了维护一个数据结构 支持查找容器内最小的 $k$个数 以及添加一个数
这显然就是一个堆了 总的复杂度是 $O(n + nlogk)$
由于在 $mod 5$ 的$5$中情况下 所有初始值转移到目标值的代价多少的排序并不是一样的
因此我们维护$5$个堆就好
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 2e5 + ;
const long long inf = 1e9;
int a[N], dis[N * ];
long long sum[];
long long ans = 1e18;
int n, k, b, c, cnt;
priority_queue <long long> q[];
int main()
{
scanf("%d%d%d%d", &n, &k, &b, &c);
b = min(b, c * );
for(int i = ; i <= n; ++i)
{
scanf("%d", &a[i]);
for(int j = ; j < ; ++j)
dis[cnt++] = a[i] + j;
}
sort(a + , a + + n);
sort(dis, dis + cnt);
cnt = unique(dis, dis + cnt) - dis;
int now = ;
for(int i = ; i < cnt; ++i)
{
int x = dis[i], kind =(inf + x) % ;
long long cost;
while(now <= n && a[now] <= x)
{
for(int j = ; j < ; ++j)
{
cost = (inf + j - a[now]) / * b + (inf + j - a[now]) % * c;
q[j].push(cost);
sum[j] += cost;
if((int)q[j].size() > k)
{
sum[j] -= q[j].top();
q[j].pop();
}
}
++now;
}
long long y = (inf + kind - x) / * b * k;
if((int)q[kind].size() == k)
ans = min(ans, sum[kind] - y);
}
printf("%lld\n", ans);
return ;
}
codeforces 657C - Bear and Contribution [想法题]的更多相关文章
- Codeforces 639D Bear and Contribution
Bear and Contribution 对于对于5余数为, 0, 1, 2, 3, 4的分别处理一次, 用优先队列贪心. #include<bits/stdc++.h> #define ...
- CodeForces - 156B Suspects 逻辑 线性 想法 题
题意:有1~N,n(1e5)个嫌疑人,有m个人说真话,每个人的陈述都形如X是凶手,或X不是凶手.现在给出n,m及n个陈述(以+x/-X表示)要求输出每个人说的话是true ,false or notd ...
- CodeForces - 798D Mike and distribution 想法题,数学证明
题意:给你两个数列a,b,你要输出k个下标,使得这些下标对应的a的和大于整个a数列的和的1/2.同时这些下标对应的b //题解:首先将条件换一种说法,就是要取floor(n/2)+1个数使得这些数大于 ...
- CodeForces - 55C Pie or die 想法题(猜程序)
http://codeforces.com/problemset/problem/55/C 题意:一个博弈. 题解:瞎猜,目前不清楚原理 #include<iostream> #inclu ...
- codeforces 584E Anton and Ira [想法题]
题意简述: 给定一个$1$到$n(n<=2000)$的初始排列以及最终排列 我们每次可以选取位置为$i$和$j$的 并交换它们的位置 花费为$ |i-j| $ 求从初始状态变换到末状态所需最小花 ...
- codeforces gym 100345I Segment Transformations [想法题]
题意简述 给定一个由A C G T四个字母组成的密码锁(每拨动一次 A变C C变G G变T T变A) 密码锁有n位 规定每次操作可以选取连续的一段拨动1~3次 问最少几次操作可以将初始状态变到末状态 ...
- codeforces 11 B.Jumping Jack 想法题
B. Jumping Jack Jack is working on his jumping skills recently. Currently he's located at point zero ...
- CodeForces 111B - Petya and Divisors 统计..想法题
找每个数的约数(暴力就够了...1~x^0.5)....看这约数的倍数最后是哪个数...若距离大于了y..统计++...然后将这个约数的最后倍数赋值为当前位置...好叼的想法题.... Program ...
- Codeforces 385C Bear and Prime Numbers
题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...
随机推荐
- tensorflow学习笔记七----------RNN
和神经网络不同的是,RNN中的数据批次之间是有相互联系的.输入的数据需要是要求序列化的. 1.将数据处理成序列化: 2.将一号数据传入到隐藏层进行处理,在传入到RNN中进行处理,RNN产生两个结果,一 ...
- django商城项目之用sentry管理日志
之前写商城项目的时候,采用的日志处理方式为在终端输出或者写入文件,这样的话,项目部署上线之后,若服务器出现错误,需要到服务器查看相关的错误日志,很不方便.后期在学习别人开源项目的时候,学习到一个开源的 ...
- 模板 - 无旋Treap
一般而言作为一棵平衡树只需要插入,删除,值求排名,排名求值,前驱,后继,六个接口. #include<bits/stdc++.h> using namespace std; typedef ...
- eclipse调试openstack的nova代码
前段时间一直在研究openstack的nova部分的代码.特别想知道,怎样用eclipse来调试代码.也在论坛上问了别人.无果.最后还是自己摸索出了出路. 以下写出自己探索之路.我是用devstack ...
- IDEA 增加对JPA的支持 执行JPQL语句
IDEA 可以在控制台console中执行JPQL语句: 1. 在已存在的项目中选择项目结构: 2. 选择模块-指定实体所在的模块-选择上面的号 2. 选择要添加的模块:我们使用的是JPA,也可能有的 ...
- Laravel 学习笔记之数据库操作——Eloquent ORM
1. 时间戳 默认情况下在使用ORM操作数据库进行添加.修改数据时, created_at 和 updated_at列会自动存在于数据表中,并显示的是 ‘2017’格式,如果想以 Unix时间戳格式存 ...
- js 全世界最短的IE浏览器判断代码
var ie = !+"\v1"; 仅仅需要7bytes!参见这篇文章,<32 bytes, ehr ... 9, ehr ... 7!!! to know if your ...
- CSS链接使用伪类的顺序
顺序为:link-visited-hover-active a:link {color: #FF0000} /* 未访问的链接 */ a:visited {color: #00FF00} /* 已访问 ...
- 认识一下Qt用到的开发工具
http://c.biancheng.net/view/3868.html Qt 不是凭空产生的,它是基于现有工具链打造而成的,它所使用的编译器.链接器.调试器等都不是自己的,Qt 官方只是开发了上层 ...
- Crazy Search POJ - 1200 (字符串哈希hash)
Many people like to solve hard puzzles some of which may lead them to madness. One such puzzle could ...