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);
	}
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章