bzoj1588
作者:互联网
营业额统计
营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。 输入输出要求
Input 第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i 天公司的营业额。 天数n<=32767, 每天的营业额ai <= 1,000,000。 最后结果T<=2^31Output
输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。
Sample Input6 5 1 2 5 4 6Sample Output12 Hint
结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12
该题数据bug已修复.----2016.5.15
sol:并不知道这在考什么?如果是平衡树的话,似乎set直接水过了,就是找第一个比它小的和比它大的元素
Ps:set中begin是第一个元素,但是end不是最后一个元素,end-1才是
#include <bits/stdc++.h> using namespace std; typedef int ll; inline ll read() { ll s=0; bool f=0; char ch=' '; while(!isdigit(ch)) { f|=(ch=='-'); ch=getchar(); } while(isdigit(ch)) { s=(s<<3)+(s<<1)+(ch^48); ch=getchar(); } return (f)?(-s):(s); } #define R(x) x=read() inline void write(ll x) { if(x<0) { putchar('-'); x=-x; } if(x<10) { putchar(x+'0'); return; } write(x/10); putchar((x%10)+'0'); return; } #define W(x) write(x),putchar(' ') #define Wl(x) write(x),putchar('\n') int n; multiset<int>S; int main() { int i,x,y,ans=0; R(n); R(x); ans+=x; S.insert(x); R(y); ans+=abs(x-y); S.insert(y); for(i=3;i<=n;i++) { R(x); multiset<int>::iterator it=S.lower_bound(x); if(it==S.begin()) { ans+=(*it)-x; } else if(it==S.end()) { it--; ans+=x-(*it); } else { int tmp=(*it)-x; *it--; tmp=min(tmp,abs(x-(*it))); ans+=tmp; } S.insert(x); } Wl(ans); return 0; } /* input 6 5 1 2 5 4 6 output 12 */View Code
标签:tmp,营业额,ch,bzoj1588,int,波动,ans 来源: https://www.cnblogs.com/gaojunonly1/p/10658674.html