促销

促销

Time Limit:2000MS  Memory Limit:65536K
Total Submit:154 Accepted:35

Description

Bytelandish连锁超市委托你编写一个程序来模拟一项即将施行的促销活动,该活动的规则如下: 
●想要参与的顾客,只需把他的个人资料写在帐单上,并把帐单放入投票箱; 
●每天活动结束时,数额最大、最小的两张帐单被取出,付款数额最大的顾客将获得一笔奖金,价值为取出的两张帐单的数额之差; 
●为了不重复计算,取出的两张帐单不再放回箱子,而剩下的帐单仍保留在箱中,进行第二天的活动。 
超市每天的营业额很大,因此可假定:每天活动结束时,箱中至少有两张帐单以供取出。 
你的任务是根据每天投入箱中的帐单,计算出这项促销活动期间超市付出的奖金总数额。 
任务: 
编写一个程序,完成下列工作: 
●从文件PRO.IN读入投入箱中的帐单的信息; 
●算出促销活动期间的奖金总额; 
●把结果写入文件PRO.OUT。 

Input

第一行是整数n(1≤n≤5000),表示促销活动持续的天数。以下n行,每行是一些用空格分开的非负整数。第i+1行上的数字表示第i天投入箱中的帐单的数额,该行第一个整数k(0≤k≤10^5)代表这天的帐单总数目,接下来的k个正整数表示每张帐单的数额,不超过10^6。 
整个活动期间,投入箱中的帐单不超过10^6张。 

Output

含一个整数,即整个活动中的奖金总额。

Sample Input

5
3 1 2 3
2 1 1
4 10 5 5 1
0
1 2

Sample Output

19

用一个桶记录每个数额有多少张,每次找max和min
也可以用堆做


 
 
  • const
      maxn=1000000;
    
    var
      a:array[0..maxn] of longint;
      n,i,j,k,x,max,min:longint;
      ans:int64;
    
    begin
      readln(n);
      for i:=1 to n do
        begin
          read(k);
          for j:=1 to k do
            begin
              read(x);
              inc(a[x]);
            end;
          max:=0;min:=0;
          for j:=1000000 downto 1 do
            if a[j]>0 then
              begin
                max:=j;
                dec(a[j]);
                break;
              end;
          for j:=1 to 1000000 do
            if a[j]>0 then
              begin
                min:=j;
                dec(a[j]);
                break; 
              end;
          ans:=ans+max-min;
        end;
      writeln(ans);
    end.
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值