小鸡
- n个养鸡场,
- i个养鸡场初始有a[i]只鸡
- 每天增k只鸡
- 每天结束都会在数量最多的养鸡场里卖掉一半鸡
- 有x只鸡,则卖出后只剩下x/2(向下取整)只鸡
- m天后的n个养鸡场一共多少只小鸡
- 第一行输入三个int类型n,m,k(1 <= n,m,k <= 10^6)
- 第二行输入n个正整数,表示n个养鸡场初始鸡的个
文章图片
?
//#include#include
#include
#include
using namespace std;
typedef long long ll;
int main() {
int n, m, k, t;
ll base(0), sum(0);
//scanf("%d%d%d", &n, &m, &k);
cin >> n >> m >> k;
priority_queue heap;
//默认大根堆
for (int i = 0;
i < n;
i++) {
cin >> t;
heap.emplace(t);
sum += t;
}
for (int i = 0;
i < m;
i++) {
base += k;
t = heap.top() + base;
int d = (t + 1) / 2;
heap.pop();
heap.emplace(t - d - base);
sum -= d;
} printf("%lld\n", base * n + sum);
}
- 由于C++优先队列没有提供遍历的方法,也就是你没法对队列里的每个元素都加k,
- 所以我先把这些k记下来,用base累加。
- 对于每个top,其实它是top+base值么多只鸡
- 然后杀掉一半,但最后记得要把base减下去啊
- 最后就好了。
- 添加链接描述