18北邮网研院-D.最大价值 //贪心

题目描述
对于每一个零件都有一个适宜温度区间,[Ri,Ji],当温度t<Ri,零件价值为x,当t>Ji,零件价值为z;当温度适宜,价值为y。且y>x,y>z。此刻,有一恒温箱,可确定温度t。

输入
第一行按顺序分别为 n,x,y,z。0<n<20000
接下来n行为 每一个零件的适宜温度区间0<Ri<Ji<10^9

输出
确定一个温度值t,在这温度下所有零件的总价值最大,并输出该价值

样例输入
3 1 3 2
1 4
2 5
7 10

样例输出
7
 

思路:

因为温度最大值为10^9,遍历每个温度必超时,故只能转变思路,可遍历区间各端点。因为每个区间的左中右对应的值都是相同的,所有可以n个区间看做两种值,一种是左端点值,另一种是右端点值+1。将所有的端点从小到大排序,并遍历这2*n个点,用m表示当前温度的价值总和,初始值为n*x(因为最小的必定在所有区间的左边),若遍历到是左端点,表示进入了一个适宜温度区间:m+=y-x(y-x为中间与左边的价值差);若遍历到是右端点+1,表示刚离开了一个适宜温度区间:m-=y-z(y-z为中间与右边的价值差)。统计出m的最大值即所求解。

代码如下:

#include<bits/stdc++.h>
using namespace std;
struct D
{
	int x,lr;    //lr=0表示左端点,lr=1表示右端点
}d[40003];
int cmp(D d1,D d2)
{
	return d1.x<d2.x;
}
int main()
{
	int n,x,y,z,i,j;
	while(~scanf("%d%d%d%d",&n,&x,&y,&z))
	{
		int l,r;
		for(i=0;i<n;++i)
		{
			scanf("%d %d",&l,&r);
			d[2*i].x=l;
			d[2*i].lr=0;
			d[2*i+1].x=r+1;
			d[2*i+1].lr=1;
		}
		sort(d,d+2*n,cmp);
		int m=n*x,max=0;
		for(i=0;i<2*n;++i)
		{
			if(d[i].lr==0)m+=y-x;
			else m-=y-z;
			if(m>max)
			{
				max=m;
				//k=d[i].x;	
			}
		}
		printf("%d\n",max);
	}
} 

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值