1. 程式人生 > >cogs 1435. [USACO NOV]金髮姑娘和N頭牛

cogs 1435. [USACO NOV]金髮姑娘和N頭牛

1435. [USACO NOV]金髮姑娘和N頭牛

★★☆   輸入檔案:milktemp.in   輸出檔案:milktemp.out   簡單對比
時間限制:1 s   記憶體限制:256 MB

【題目描述】

你可能已經聽說了金髮姑娘和3只熊的經典故事。

鮮為人知的是,金髮姑娘最終經營了一個農場。在她的農場,她有一個穀倉含N頭奶牛(1<=N <= 20000)。不幸的是,她的奶牛對溫度相當敏感。

第i頭奶牛必須在指定的溫度範圍內A(i)..B(i)才感覺舒適;(0<=A(i)<=B(i)<= 1,000,000,000)。如果金髮姑娘在穀倉放置一個溫控器;如果溫度T<A(i),牛會太冷,並將產生x單位牛奶。如果她把恆溫器調到(A(i)<=T<=B(i))這個範圍內,那麼牛會感到舒適,並將產生Y單位牛奶。如果她把恆溫器調到溫度T>B(i),牛會感覺很熱,並將產生的Z單位牛奶。正如預期的那樣,Y的值總是大於X和Z。

給定的X,Y,和Z,以及每個牛的溫度的最佳範圍,如果金髮姑娘設定穀倉的溫控器最佳,請計算金髮姑娘得到牛奶的最大數量,已知X,Y和Z都是整數,範圍0..1000。溫控器可以設定為任意整數的值。

【輸入格式】

第1行:四個用空格隔開的整數:N X Y Z。

第2行..1 + N:行1+i包含兩個用空格隔開的整數:A(i)和B(i)。

【輸出格式】

1行:金髮姑娘最多可以獲得的牛奶,當她在穀倉的最佳溫度設定。

【樣例輸入】

4 7 9 6 5 8 3 4 13 20 7 10

【樣例輸出】

31

【提示】

在農場裡有4頭奶牛,溫度範圍5..8,3..4,13..20,10..7。一個寒冷的奶牛生產7單位的牛奶,一個舒適的奶牛生產9個單位的牛奶,一個熱牛生產6單位牛奶。

【資料規模】

50%的測試資料:n<=5

其餘50%的測試資料:10000<n<=20000.

【來源】

USACO 2013 November Contest, Bronze

translate by cqw

data from cstdio

/*最優溫度一定在邊界處取得,然後列舉就可以了*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,x,y,z,ans;
int num1[20010],num2[20010]; int main(){ freopen("milktemp.in","r",stdin); freopen("milktemp.out","w",stdout); scanf("%d%d%d%d",&n,&x,&y,&z); for(int i=1;i<=n;i++) scanf("%d%d",&num2[i],&num1[i]); sort(num1+1,num1+1+n); sort(num2+1,num2+1+n); for(int i=1;i<=n;i++){ int tmp1=upper_bound(num2+1,num2+1+n,num1[i])-num2;//最小值大於 受冷 int tmp2=lower_bound(num1+1,num1+1+n,num1[i])-num1-1;//最大值小於 受熱 if(tmp2>n) tmp2=0; if(tmp1>n) ans=max(ans,tmp2*z+(n-tmp2)*y); else ans=max(ans,tmp2*z+(n-tmp1+1)*x+(tmp1-tmp2-1)*y); tmp1=upper_bound(num2+1,num2+1+n,num2[i])-num2;//最小值大於 受冷 tmp2=lower_bound(num1+1,num1+1+n,num2[i])-num1-1;//最大值小於 受熱 if(tmp2>n) tmp2=0; if(tmp1>n) ans=max(ans,tmp2*z+(n-tmp2)*y); else ans=max(ans,tmp2*z+(n-tmp1+1)*x+(tmp1-tmp2-1)*y); } cout<<ans; } /* 4 787 993 302 24514 27256 28276 28702 13708 19182 19192 30394 */
View Code