POI2000Promocja促销
Great Byteland 的连锁超市请你帮助他们设计一个程序,用来模拟即将开展的促销活动所需要的经费。促销活动遵循以下原则:
参与本活动的顾客,应将自己的个人信息写在所付账单背面,并将账单投入指定的箱子。
在每天的销售结束后,箱子中消费金额最大和最小的两张账单将被选出。消费最多的顾客将得到一笔奖金,奖金的数目等于两张账单金额之差。
为了避免因为一次消费而得到多笔奖金,依照以上原则选出的两张账单将不被放回到箱子中,但箱子里剩下的账单可以继续参加第二天的活动。
超市的营业额非常大,所以你可以假设:每天的销售结束后,在准备取出账单时,箱子里至少有两张账单。
你的任务是根据每天投入箱子的所有账单,计算出整个促销活动中超市要付出的奖金总额。
求解任务:
请设计一个程序:
从文件pro.in中读入每天投入箱子中的所有账单的清单。计算出整个促销活动过程中超市要付出的总奖金。将结果写到pro.out中。
输入文件pro.in:
输入文件pro.in的第一行是一个整数 n(1n5000),表示促销活动历时的天数。
以下的n行,每行包含若干由空格分隔的非负整数。第i+1行的数表示在第i天投入箱子的账单金额。每行的第一行是一个整数k(0k105), 表示当日账单的数目。后面的k个正整数代表这k笔账单的金额,均小于106。整个活动中涉及到的账单笔数不会超过106 。
输出文件pro.out:
输出文件pro.out的唯一一行是一个整数,等于整个促销活动中应该付出的奖金总额。
输入样例:
pro.in
5
3 1 2 3
2 1 1
4 10 5 5 1
0
1 2
输出样例:
pro.out
19
//堆排(大顶堆、小顶堆)
平均性能O(N*logN)。
#include<bits/stdc++.h>
using namespace std;
int a[10000000];
int i,j,k,m,n,ans;
void Big()
{
for (int j=m; j>=2; j--)
if (a[j]>a[j/2])
{
swap(a[j],a[j/2]);
}
}
void Small()
{
for (int j=m; j>=2; j--)
if (a[j]<a[j/2])
{
swap(a[j],a[j/2]);
}
}
int main()
{
freopen("Pro.in","r",stdin);
freopen("Pro.out","w",stdout);
cin>>n;
m=0;
ans=0;
for(i=1; i<=n; i++)
{
cin>>j;
for (k=1; k<=j; k++) cin>>a[k+m];
m+=j;
Big();
ans+=a[1];
a[1]=a[m]; m--;
Small();
ans-=a[1];
a[1]=a[m]; m--;
}
cout<<ans;
return 0;
}
浙公网安备 33010602011771号