题目描述
超市里有N个商品. 第i个商品必须在保质期(第di天)之前卖掉, 若卖掉可让超市获得pi的利润.
每天只能卖一个商品.
现在你要让超市获得最大的利润.
输入
每组数据第一行为一个整数N(0<N≤10000), 即超市的商品数目之后N行,每行各有两个整数, 第i行为pi,di(1<=pi,di<=10000)输出 输出当前条件下超市的最大利润.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define swap(a,b) {\
__typeof(a) __c=(a);\
(a)=(b);\
(b)=__c;\
}
typedef struct Node{
int day;
int val;
}Node;
typedef struct Heap{
Node *data,*__data;
int val,pos,n;
}Heap;
Heap *getNewHeap(int n){
Heap *p=(Heap *)malloc(sizeof(Heap));
p->__data=(Node *)malloc(sizeof(Node)*n);
p->data=p->__data-1;
p->n=n;
p->pos=0;
p->val=0;
return p;
}
void up_updata_val(Node *p,int n){
if(n==1) return ;
if(p[n].val<p[n/2].val){
swap(p[n],p[n/2]);
up_updata_val(p,n/2);
}
return ;
}
void down_updata_val(Node *p,int i,int n){
if(n==1) return ;
int r=i*2+1,l=i*2,ind=i;
if(l<=n){
if(p[ind].val>p[l].val) ind=l;
if(r<=n&&p[ind].val>p[r].val) ind=r;
if(ind==i) return ;
swap(p[i],p[ind]);
down_updata_val(p,ind,n);
}
return ;
}
void down_updata_day(Node *p,int i,int n){
if(n==1) return ;
int r=i*2+1,l=i*2,ind=i;
if(l<=n){
if(p[ind].day>p[l].day) ind=l;
if(r<=n&&p[ind].day>p[r].day) ind=r;
if(ind==i) return ;
swap(p[ind],p[i]);
down_updata_day(p,ind,n);
}
return ;
}
void heap_sort(Node *p,int n){
if(n==1) return ;
for(int i=n/2;i>=1;i--){
down_updata_day(p,i,n);
}
return ;
}
Node *pop(Node *p,int n){
if(n==1) return &p[1];
swap(p[1],p[n]);
down_updata_day(p,1,n-1);
return &p[n];
}
int main(void){
int n;
scanf("%d",&n);
Heap *p=getNewHeap(n);
Node *__data=(Node *)malloc(sizeof(Node)*n);
for(int i=0;i<n;i++){
scanf("%d %d",&__data[i].val,&__data[i].day);
}
Node *data=__data-1;
heap_sort(data,n);
while(n>0){
Node *temp=pop(data,n);
n--;
if(temp->day>p->pos){
p->pos+=1;
memcpy(&p->data[p->pos],temp,sizeof(Node));
p->val+=temp->val;
up_updata_val(p->data,p->pos);
}
else if(temp->day==p->pos){
if(temp->val>data[1].val){
p->val-=p->data[1].val;
memcpy(&p->data[1],temp,sizeof(Node));
p->val+=temp->val;
down_updata_val(p->data,1,p->pos);
}
}
}
printf("%d",p->val);
return 0;
}
代码运行后由于测试用例过大无法看到测试用例全部数据,无法调试,但是自测数据正常运行,如有发现代码bug欢迎斧正。