BZOJ 1208: [HNOI2004]宠物收养所

Fancy posted @ 2015年7月10日 00:06 in BZOJ , 265 阅读

题目大意:收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物。领养者有希望领养的宠物的特点值,宠物也要一个特点值。宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少。

1.被遗弃的宠物过多时,假若到来一个领养者,这个领养者希望领养的宠物的特点值为a,那么它将会领养一只目前未被领养的宠物中特点值最接近a的一只宠物。(任何两只宠物的特点值都不可能是相同的,任何两个领养者的希望领养宠物的特点值也不可能是一样的)如果有两只满足要求的宠物,即存在两只宠物他们的特点值分别为a-b和a+b,那么领养者将会领养特点值为a-b的那只宠物。

2. 收养宠物的人过多,假若到来一只被收养的宠物,那么哪个领养者能够领养它呢?能够领养它的领养者,是那个希望被领养宠物的特点值最接近该宠物特点值的领养者,如果该宠物的特点值为a,存在两个领养者他们希望领养宠物的特点值分别为a-b和a+b,那么特点值为a-b的那个领养者将成功领养该宠物。 一个领养者领养了一个特点值为a的宠物,而它本身希望领养的宠物的特点值为b,那么这个领养者的不满意程度为abs(a-b)。

【任务描述】你得到了一年当中,领养者和被收养宠物到来收养所的情况,希望你计算所有收养了宠物的领养者的不满意程度的总和。这一年初始时,收养所里面既没有宠物,也没有领养者。

 

STL大法好。。。

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<set>
const int inf=0x7fffffff;
using namespace std;
set<int> s;
int n,m,x,y,ans,num;
long long a,b,l,r;
int main()
{
	scanf("%d",&n);
	s.insert(inf);s.insert(-inf);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&x,&y);
		if(s.size()==2)  {s.insert(y);num=x;}
		else if(x==num) s.insert(y);
		else
		{
			a=*s.lower_bound(y);
			b=*--s.lower_bound(y);
			r=a-y;l=y-b;
			if(r<l)	s.erase(a),ans=(ans+r)%1000000;
			else	s.erase(b),ans=(ans+l)%1000000;
		}
	}
	printf("%d",ans);
}

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter