1070 Mooncake

注意,浮点数相减会产生误差,所以

1:判断a==b用 a - b < 1e-9

2 : cmp函数里不能直接用return (int)(a-b)

#include <stdio.h>
#include <algorithm>
int n,d;

typedef struct mcake{
	float inv;
	float sumP;//总价
	float perP;//单价

};
mcake ms[1000+5];

int cmp(const void * a, const void * b){
	mcake ma = *(mcake *)a;
	mcake mb = *(mcake *)b;
	
	if(mb.perP>ma.perP){//判断b>a
			return 1;
	}
	return -1;//相等或者a>b

	//return (int)(mb.perP-ma.perP);//错误!因为两个float相减会有误差,fuck
}

int main(){
	freopen("in.txt","r",stdin);

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

	for(int i = 0 ; i < n; i++){
		mcake mc;
		scanf("%f",&mc.inv);
		ms[i] = mc;
	}

	for(int i = 0; i < n; i++){
		float tmp;
		scanf("%f",&tmp);
		ms[i].sumP = tmp;
		ms[i].perP = tmp/ms[i].inv;
	}
	
	qsort(ms,n,sizeof(mcake),cmp);

	int total = 0;
	float profit = 0.0;
	for(int i = 0; i < n; i++){
		if(total + ms[i].inv <= d){
			profit += ms[i].sumP;
		}else{			
			profit += (d-total)/ms[i].inv * ms[i].sumP;
		}
		total += ms[i].inv;

		if(total >= d){
			break;
		}
	}

	printf("%.2f", profit);

	return 0;
}


你可能感兴趣的:(1070 Mooncake)