bzoj1588 营业额统计

Description

营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。  输入输出要求

Input

第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i天公司的营业额。

Output

输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。



本着“不要重复发明轮子”的原则,能用set的就不手写平衡树。既费时间还容易错。

对于每天,如果该元素没有出现过,找到集合里小于他的最大值和大于他的最小值。取接近的一个即可。然后把这个元素加入集合。

注意这个元素是最大值或最小值的情况(即没有小于他的或没有大于他的)。




#include
#include
using namespace std;
set s;
set::iterator it;
int a[100010];
int abs(int x)
{
	return x>0?x:-x;
}
int main()
{
	int i,j,k,m,n,p,q,x,y,z,ans;
	scanf("%d",&n);
	for (i=1;i<=n;i++)
	  scanf("%d",&a[i]);
	ans=a[1];
	s.insert(a[1]);
	for (i=2;i<=n;i++)
	{
		if (s.count(a[i])) continue;
		x=*(--s.lower_bound(a[i]));
		y=*s.upper_bound(a[i]);
		if (!s.count(x))
		  ans+=abs(a[i]-y);
		else
		{
			if (!s.count(y))
			  ans+=abs(a[i]-x);
			else
			  ans+=min(abs(a[i]-x),abs(a[i]-y));
		}
		s.insert(a[i]);
	}
	printf("%d\n",ans);
}


你可能感兴趣的:(数据结构)