3月30日 锕鲤两导体

小鸡

  • n个养鸡场,
  • i个养鸡场初始有a[i]只鸡
  • 每天增k只鸡
  • 每天结束都会在数量最多的养鸡场里卖掉一半鸡
  • 有x只鸡,则卖出后只剩下x/2(向下取整)只鸡
  • m天后的n个养鸡场一共多少只小鸡

  • 第一行输入三个int类型n,m,k(1 <= n,m,k <= 10^6)
  • 第二行输入n个正整数,表示n个养鸡场初始鸡的个

3月30日 锕鲤两导体_第1张图片

//#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<int> 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减下去啊
  • 最后就好了。

canci

  • 添加链接描述

你可能感兴趣的:(jerry:gzh)