【平衡二叉樹】超市促銷

题目描述

球球和小姜管理着巨大的校园超市联盟,听说今年将有很多OIer到学校来参加NOIP,他俩决定在NOIP期间(包括准备期间)举行促销活动。
促销活动必须遵守下列规定:
想要参加促销的每位OIer,必须将自己的每笔消费账单丟入指定的盒子里。每天活动结束时,球球和小姜会从盒子里挑出金额最大和最小的两张账单。消费最多的客户将要得到一笔奖金! 数额是挑出的两张金额的差的绝对值。输入数据保证每天总可以找到两张账单。
为了避免重复获奖,每天挑出的账单不能重新放回盒子里,其余的账单将留在盒中,继续参加促销活动,直到活动结束。
在紧张的复习NOIP阶段,球球和小姜实在没有精力来计算促销活动的花费,他们找到了聪明的你,你的任务是根据每天活动的信息算出促销活动的总花费。
输入格式

输入的第一行是一个整数n,表示促销的天数。(1 <= n <= 5000)
在接下来的n行中,每行有若干个非负整数,用空格隔开。第i+1行的数据代表第i天的账单信息,每行第一个整数k(0 <= k <= 10^5)。表示今天有多少个新账单。接下来k个正整数表示每张账单的金额wij(1 <= wij <= 10^6)
输出格式

输出中只有一个整数,表示整个促销活动期间所有的花费。
样例输入
5
3 1 2 3
2 1 1
4 10 5 5 1
0
1 2
样例输出
19

平衡二叉樹做法:用STL的multiset做會很簡單。

Accode:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <set>

using std::multiset;

const char fi[] = "rqnoj572.in";
const char fo[] = "rqnoj572.out";
const int maxN = 5010;

multiset <int> task;
int n, ans;

  void init_file()
  {
    freopen(fi, "r", stdin);
    freopen(fo, "w", stdout);
  }

  void work()
  {
    scanf("%d", &n);
    ans = 0;
    for (int i = 0; i < n; ++i)
    {
      int t;
      scanf("%d", &t);
      for (; t; --t)
      {
        int x;
        scanf("%d", &x);
        task.insert(x);
      }
      int Min = *task.begin();
      task.erase(task.begin());
      int Max = *task.rbegin();
      ans += Max - Min;
      task.erase(task.find(Max));
    }
    if (ans != 2) printf("%d", ans);
    else printf("\n");
  }

int main()
{
  init_file();
  work();
  exit(0);
}


你可能感兴趣的:(【平衡二叉樹】超市促銷)