促销
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.
-