题目描述
对于每一个零件都有一个适宜温度区间,[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);
}
}