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;
}

 

posted @ 2018-07-13 08:00  SandStorm红的风情  阅读(182)  评论(0)    收藏  举报