海贼oj#284. 超市卖货

题目描述
​ 超市里有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欢迎斧正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值