您的位置:首页 > 其它

poj2010解题报告(堆)

2015-07-27 01:01 260 查看
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

class   tri
{
public:
int first;
int second;
int third;

bool    operator < (const tri temp)const
{
return first<temp.first;
}
};

bool    cmp_p(const tri temp1,const tri temp2)
{
return temp1.second<temp2.second;
}

bool    cmp(const tri temp1,const tri temp2)
{
return temp1.second<temp2.second;
}

int n,c,f,sum_left=0,sum_right=0;
bool    In_Min_List[110000],Out_Of_List[110000];
tri cow[110000],List[110000];

int main()
{
int i,j,m;

scanf("%d%d%d",&n,&c,&f);

for(i=1;i<=c;++i)
{
scanf("%d%d",&cow[i].first,&cow[i].second);
}

sort(cow+1,cow+c+1);

for(i=1;i<=c;++i)
{
cow[i].third=i;
}

m=n>>1;
j=m;

memcpy(List,cow,sizeof(cow));
sort(List+1,List+c-m,cmp_p);

for(i=1;i<=m;++i)
{
In_Min_List[List[i].third]=true;
sum_left+=List[i].second;
}

sort(List+c-m+1,List+c+1,cmp_p);
for(i=c-m+1;i<=c;++i)
{
sum_right+=List[i].second;
}

make_heap(List+c-m+1,List+c+1,cmp);

for(i=c-m;i>=m+1;--i)
{
if(sum_left+sum_right+cow[i].second<=f)
{
printf("%d\n",cow[i].first);
goto End;
}

if(In_Min_List[i-1])
{
sum_left-=cow[i-1].second;
Out_Of_List[i-1]=true;
while(Out_Of_List[List[++j].third]);
sum_left+=cow[List[j].third].second;
In_Min_List[List[j].third]=true;
}
else
{
Out_Of_List[i-1]=true;
}

if(cow[i].second<List[c-m+1].second)
{
sum_right-=List[c-m+1].second-cow[i].second;
pop_heap(List+c-m+1,List+c+1,cmp);
List[c]=cow[i];
push_heap(List+c-m+1,List+c+1,cmp);
}
}

printf("-1\n");
End:
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: