题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=946
题目大意:给你N个数,对于每个数ai,计算出 曾经某天最近接ai的销售额与ai的差,并求出总的差异和。
解题思路:对于每次插入一个数,只需查找它在之前出现的数中的位置,则最小差异肯定为 当前数ai与前面数的差 和 ai后面数与ai的差 中较小的一个,当插入在两端的时候特判一下。
STL容器中的set刚好有排序功能,用lower_bound()查找插入位置,可能数据有点水,就水过了。。。
表示STL很强大,要好好学了。。。
代码如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<set>
using namespace std;
set <int> s;
set <int>::iterator it,p;
int main()
{
int T,n,a;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
scanf("%d",&a);
s.insert(a);
long long sum=a;
for(int i=1; i<n; i++)
{
scanf("%d",&a);
it = s.end();
it --;
if(*it < a) sum += a - *it, s.insert(a);//特判插入末尾
else
{
it = s.lower_bound(a);
if(*it==*s.begin()) sum += *it - a, s.insert(a);//特判插入开头
else
{
long long x=*it-a;
long long y=a-*(--it);
sum+=x>y?y:x;
s.insert(a);
}
}
}
printf("%lld\n\n",sum);
s.clear();
}
return 0;
}