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日 锕鲤两导体】?
3月30日 锕鲤两导体
文章图片
?
//#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减下去啊
  • 最后就好了。
canci
  • 添加链接描述

    推荐阅读