HDU 1280 第M大数 堆的应用
#include <iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int N;
int M;
int sequence[3000];
int order[3000];
class Minheap
{
private:
int* heap;
int currentSize;
int MaxHeapSize;
void FilterDown(int start,int endOfheap)
{
int i=start;
int j=2*i+1;
int temp=heap[i];
while(j<=endOfheap)
{
if(j<endOfheap && heap[j]>heap[j+1])j++;
if(temp<=heap[j])break;
else
{
heap[i]=heap[j];
i=j;
j=2*j+1;
}
}
heap[i]=temp;
}
void FilterUp(int start)
{
int j=start;
int i=(start-1)>>1;
int temp=heap[j];
while(i>=0)
{
if(heap[i]<=temp)break;
else
{
heap[j]=heap[i];
j=i;
i=(i-1)>>1;
}
}
heap[j]=temp;
}
public:
Minheap()
{
currentSize=0;
this->MaxHeapSize=M;
heap=new int[M];
}
void insert(int x)
{
heap[currentSize]=x;
FilterUp(currentSize);
currentSize++;
}
int top(){return heap[0];}
int Remove()
{
int Min=heap[0];
heap[0]=heap[currentSize-1];
currentSize--;
FilterDown(0,currentSize-1);
return Min;
}
void modify(int x)
{
heap[0]=x;
FilterDown(0,currentSize-1);
}
~Minheap(){delete heap;}
};
int main()
{
while(scanf("%d %d",&N,&M)!=EOF)
{
int i,j,k;
Minheap * heap=new Minheap();
for(i=1;i<=M;i++)
{
heap->insert(0);
}
for(i=0;i<N;i++)
{
scanf("%d",&sequence[i]);
}
for(i=0;i<N;i++)
{
for(j=i+1;j<N;j++)
{
if((sequence[i]+sequence[j])>heap->top())
{
heap->modify(sequence[i]+sequence[j]);
}
}
}
for(i=M-1;i>=0;i--)
{
order[i]=heap->Remove();
}
for(i=0;i<M-1;i++)
{
printf("%d ",order[i]);
}
printf("%d\n",order[i]);
}
}
posted on 2011-06-30 12:22 lonelycatcher 阅读(272) 评论(0) 编辑 收藏 举报