p1901 [usaco2013nov_bronze]mikltemp

版权声明:https://blog.csdn.net/huashuimu2003 https://blog.csdn.net/huashuimu2003/article/details/84932826

题目

描述 Description
你可能已经听说了金发姑娘和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。温控器可以设置为任意整数的值。
输入格式 Input Format
第1行:四个用空格隔开的整数:N X Y Z。
第2行…1 + N:行1+i包含两个用空格隔开的整数:A(i)和B(i)。
输出格式 Output Format
1行:金发姑娘最多可以获得的牛奶,当她在谷仓的最佳温度设定。
样例输入 Sample Input

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

样例输出 Sample Output

31
时间限制 Time Limitation
1s
注释 Hint
【提示】
在农场里有4头奶牛,温度范围5…8,3…4,13…20,7…10。一个寒冷的奶牛生产7单位的牛奶,一个舒适的奶牛生产9个单位的牛奶,一个热牛生产6单位牛奶。
【数据规模】
50%的测试数据:n<=5
其余50%的测试数据:10000<n<=20000.

来源 Source
usaco 2013 nov bronze

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e4+10;
inline int read()
{
	int f=1,num=0;
	char ch=getchar();
	while (!isdigit(ch)) { if (ch=='-') f=-1; ch=getchar(); }
	while (isdigit(ch)) num=(num<<1)+(num<<3)+(ch^48), ch=getchar();
	return num*f;
}
int low[maxn+10],high[maxn+10];
int main()
{
	int n=read(),x=read(),y=read(),z=read();
	for (int i=0; i<n; ++i)
		low[i]=read(),high[i]=read();
	sort(low,low+n),sort(high,high+n);
	low[n]=high[n]=1e9+1;
	int i=0,j=0;
	int milk=n*x,ans=n*x;
	while (i<n || j<n)
	{
		if(low[i]<=high[j])	milk+=y-x,i++;
		else milk+=z-y,j++;
		if(milk>ans) ans=milk;
	}
	printf("%d\n",ans);
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e4+10;
inline int read()
{
    int f=1,num=0;
    char ch=getchar();
    while (!isdigit(ch)) { if (ch=='-') f=-1; ch=getchar();	}
    while (isdigit(ch)) num=(num<<1)+(num<<3)+(ch^48), ch=getchar();
    return num*f;
}
map<int,int>m;//开辟一个从int映射到int的map
int l[maxn],r[maxn];
int milk[maxn*2];//记录牛奶数 
int main()
{
    int n=read(),x=read(),y=read(),z=read();
    for(int i=1;i<=n;i++)
        l[i]=read(),r[i]=read()+1;//这里记录的是需要标记的点,所以r数组要+1。
    sort(l+1,l+n+1),sort(r+1,r+n+1);//排序坐标 
    int head=1,tail=1,cnt=0;
    while(true)
    {
        if(head<=n && l[head]<r[tail])
        {
            if(!m.count(l[head])) m[ l[head] ]=++cnt;
            milk[ m[ l[head] ] ]+=y-x;
            head++;
        }
        else if(tail<=n)
        {
            if(!m.count(r[tail])) m[ r[tail] ]=++cnt;
            milk[ m[ r[tail] ] ]+=z-y;
            tail++;
        }
        if(head>n && tail>n)break;
    }
    int sum=n*x,ans=n*x;
    for(int i=1;i<=cnt;i++)
    {
        sum+=milk[i];
        ans=max(ans,sum);
    }//一边做前缀和,一边找最大值
    printf("%d\n",ans);
    return 0; 
}

猜你喜欢

转载自blog.csdn.net/huashuimu2003/article/details/84932826