#include<stdio.h>
void push(__int64* heap,__int64 n);
__int64 pop(__int64* heap);
void init(__int64* heap);
void quiksort(__int64 a[][2],__int64 low,__int64 high);
int main(void){
__int64 n,l,p,i,k,heap[10000],sum,index;
scanf("%I64d",&n);
__int64 fuel[n][2];
for(i=0;i<n;i++)
scanf("%I64d%I64d",&fuel[i][0],&fuel[i][1]);
scanf("%I64d%I64d",&l,&p);
quiksort(fuel,0,n-1);
k=n-1;
sum=0;
index=0;
init(heap);
for(i=0;i<l;i++){
if(k>=0&&(l-fuel[k][0])<=i){
push(heap,fuel[k][1]);
k--;
}
if(i==p){
index=pop(heap);
if(index==-1)
break;
p+=index;
sum++;
}
}
if(index==-1)
printf("%I64d\n",index);
else
printf("%I64d\n",sum);
return 0;
}
void init(__int64* heap){
heap[0]=0;
}
void push(__int64* heap,__int64 k){
__int64 i;
heap[0]++;
i=heap[0];
while(i>1){
if(heap[i/2]>=k)
break;
if(heap[i/2]<k)
heap[i]=heap[i/2];
i=i/2;
}
heap[i]=k;
}
__int64 pop(__int64* heap){
__int64 result,i,k;
if(heap[0]==0)
return -1;//返回非法值
result=heap[1];
i=1;
k=heap[heap[0]];
while(i*2<=heap[0]){
if(i*2+1>heap[0]){
if(heap[i*2]<=k)
break;
else{
heap[i]=heap[i*2];
i=i*2;
continue;
}
}
if(i*2+1<=heap[0]){
if(heap[i*2]<=k&&heap[i*2+1]<=k)
break;
if(heap[i*2]>heap[i*2+1]){
heap[i]=heap[i*2];
i=i*2;
}else{
heap[i]=heap[i*2+1];
i=i*2+1;
}
}
}
heap[i]=k;
heap[0]--;
return result;
}
void quiksort(__int64 a[][2],__int64 low,__int64 high){
__int64 i=low;
__int64 j=high;
__int64 temp=a[i][0];
__int64 temp1=a[i][1];
if(low<high){
while(i<j){
while((a[j][0]>=temp)&&(i<j)){
j--;
}
a[i][0]=a[j][0];
a[i][1]=a[j][1];
while((a[i][0]<=temp)&&(i<j)){
i++;
}
a[j][0]=a[i][0];
a[j][1]=a[i][1];
}
a[i][0]=temp;
a[i][1]=temp1;
quiksort(a,low,i-1);
quiksort(a,j+1,high);
}else{
return;
}
}
【Peking University Online Judge】2431(Expedition)
最新推荐文章于 2020-12-21 05:37:09 发布