Pagini recente » Cod sursa (job #2232122) | Cod sursa (job #921276) | Cod sursa (job #1896963) | Cod sursa (job #933804) | Cod sursa (job #437769)
Cod sursa(job #437769)
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <vector>
#define max(a,b) (a)<(b)?(b):(a)
using namespace std;
typedef struct{
long weight;
long height;
long lifetime;
}quince;
bool compare (quince i,quince j)
{
return (i.height<j.height);
}
long gutui()
{
long N,H,U,left,total_weight,sum=0,limit,last;
int i;
FILE *in=fopen("gutui.in","r");
fscanf(in,"%ld %ld %ld\n",&N,&H,&U);
vector<quince> q (N);
vector<long> heap;
make_heap(heap.begin(),heap.end());
for(i=0;i<N;i++)
{
fscanf(in,"%ld %ld\n",&q[i].height,&q[i].weight);
if(U)
q[i].lifetime=(H-q[i].height)/U+1;
total_weight+=q[i].weight;
left+=q[i].lifetime;
}
cout<<q.at(0).height;
fclose(in);
if(!U)
return total_weight;
sort(q.begin(),q.end(),compare);
limit=U-H%U;
if(limit==U)
limit=0;
last=limit-U;
while((!q.empty()||heap.size())&&last<=H)
{
if(heap.size())
{
sum+=heap.front();
pop_heap(heap.begin(),heap.end());
heap.pop_back();
last+=U;
}
else
{
long nr=max(1,(q.at(0).height-last)/U);
last+=U*nr;
}
while(!q.empty())
{
if(q.at(0).height>last)
break;
heap.push_back(q.back().weight);
push_heap(heap.begin(),heap.end());
cout<<heap.front()<<endl;
q.pop_back();
cout<<heap.size();
}
}
return sum;
}
int main ()
{
FILE *out=fopen("gutui.out","w");
fprintf(out,"%ld",gutui());
fclose(out);
return 0;
}