CJOJ 1308 【HNOI 2002 】营业额统计 / CodeVS 1296 营业额统计(STL,二分)

Description

Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。

Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:

该天的最小波动值=min{|该天以前某一天的营业额-该天营业额|}。

当最小波动值越大时,就说明营业情况越不稳定。

而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。

第一天的最小波动值为第一天的营业额。

Input

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

Output

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

Sample Input

6

5

1

2

5

4

6

Sample Output

12

Http

CJOJ:http://oj.changjun.com.cn/problem/detail/pid/1308

CodeVS:http://codevs.cn/problem/1296/

Source

STL

题目大意

在一列数中,设F[i]表示第i个数与前i-1个数的差的绝对值的最小值,现在求 F[1] + F[2] + …… F[n],F[1]就为第i个数

解决思路

虽然说这是一道省选难度的题目,但如果用STL+二分查找来解决,还是比较好实现的。

首先我们用一个set来依次存放营业额。为了方便叙述,我们假定当前输入的第i天的营业额为value,先不把value放入set。首先判断set中是否有value了,若已经有了value,说明以前有一天有一模一样营业额,那么这一天的最小波动值就为0。否则二分查找出刚好比value大和刚好比value小的两个数,比较差值即可。

在二分查找的时候,我们使用的是STL自带的lower_bound函数。lower_bound(value)返回的是一个刚好大于等于value的迭代器(具体情况可以自行百度)。所以lower_bound返回后我们要让其-1使得满足刚好比value小(set里面没有重复 ),至于求刚好比value大的就可以直接是lower_bound的返回值。查找完后,再把value放入set中。

另外需要注意的是,set如果为空那么用lower_bound查找会RE,所以应该先读入一个数并放入set中。正好这道题的第一天确实需要特殊处理一下(因为第一天的最小波动值就是营业额),所以在循环外读入并处理。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std; const int maxN=40000;
const int inf=2147483647; int n;
set<int> Set; int main()
{
int value;
int Ans;
cin>>n; cin>>Ans;//一定要先读入一个,否则会出错
Set.insert(Ans); for (int i=2;i<=n;i++)
{
if (scanf("%d",&value)==EOF)
{
value=0;
}
if (Set.count(value)==0)//如果为1则说明已经有过一样的营业额了,所以最小值为0
{
int a=*(--Set.lower_bound(value));//比value刚好小的数
int b=*(Set.lower_bound(value));//比value刚好大的数
if (Set.count(a)==0)//有可能出现找不到或返回空的情况
Ans+=abs(b-value);
else if (Set.count(b)==0)
Ans+=abs(a-value);
else
Ans+=min(abs(a-value),abs(b-value));
}
Set.insert(value);
}
cout<<Ans<<endl;
return 0;
}

CJOJ 1308 【HNOI 2002 】营业额统计 / CodeVS 1296 营业额统计(STL,二分)的更多相关文章

  1. Splay树-Codevs 1296 营业额统计

    Codevs 1296 营业额统计 题目描述 Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司 ...

  2. CodeVS 1296 营业额统计

    1296 营业额统计2002年  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master   题目描述 Description Tiger最近被公司升任为营业部经理, ...

  3. AC日记——营业额统计 codevs 1296 (splay版)

    营业额统计 思路: 每次,插入一个点: 然后找前驱后继: 来,上代码: #include <cmath> #include <cstdio> #include <iost ...

  4. codevs 1296 营业额统计 (splay 点操作)

    题目大意 每次加入一个值,并且询问之前加入的数中与该数相差最小的值. 答案输出所有相差值的总和. 解题分析 = = 参考程序 #include <bits/stdc++.h> using ...

  5. 【HNOI 2002】 营业额统计

    [题目链接] 点击打开链接 [算法] 观察式子 : 最小波动值 = min{|该天营业额 - 之前某天的营业额|} = min{该天营业额 - 该天营业额的前驱,该天营业额的后继 - 该天营业额} 用 ...

  6. 二分法 codevs 1432 总数统计

    codevs 1432 总数统计  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description 给出n个数,统计两两之和小于k的方 ...

  7. 网站每日PV/IP统计/总带宽/URL统计脚本分享(依据网站访问日志)

    在平时的运维工作中,我们运维人员需要清楚自己网站每天的总访问量.总带宽.ip统计和url统计等.虽然网站已经在服务商那里做了CDN加速,所以网站流量压力都在前方CDN层了像每日PV,带宽,ip统计等数 ...

  8. PLSQL_统计信息系列05_统计信息的比较

    20150506 Created By BaoXinjian

  9. PLSQL_统计信息系列02_统计信息的对象

    20150505 Created By BaoXinjian

随机推荐

  1. Java 9 揭秘(1.Java入门介绍)

    文 by / 林本托 在第一部分中,主要讲解如下内容: JDK 9 包含了哪些内容 运行代码的系统要求 如何安装 NetBeans 1 JDK 介绍 JDK 9是Java开发工具包的第九个主要版本,计 ...

  2. nodeJS之事件events

    前面的话 events模块是node的核心模块,几乎所有常用的node模块都继承了events模块,比如http.fs等.本文将详细介绍nodeJS中的事件机制 EventEmitter 多数 Nod ...

  3. (整理)使用tomcat搭建HTTP文件下载服务器

    本文是整理,非原创,由网络资料组成上自己踩的坑整理而成. 1. 假设需要下载的文件目录是D:\download1(注意这里写了个1,跟后面的名称区分) 2. 设置 tomcat 的虚拟目录.在 {to ...

  4. 初识Tensorboard

    1.什么是Tensorboard? PPT设计原则中有这样一条,叫"文不如表,表不如图",可见图表在表达中更为直观.明确.程序设计中也是一样,我们经常用图表来描述程序的结构和流程, ...

  5. Myeclipse8.6注册机代码,不用到处找注册机了

    import java.io.*; public class MyEclipseGen { private static final String LL = "Decompiling thi ...

  6. JS之DOM那些事

    DOM 是 Document Object Model(文档对象模型)的缩写.DOM分为核心DOM.XML DOM.HTML DOM,我们接触的主要是HTML DOM,HTML DOM 定义了所有 H ...

  7. python 最佳实践与资源汇总

    python 最佳实践 (部分) 一. 结构化工程 文件 功能 README.rst readme LICENSE 许可证 setup.py 打包和发布管理 requirements.txt 开发依赖 ...

  8. 关于MATLAB处理大数据坐标文件2017622

    今天新提交了一次数据,总量达到10337个,本以为成绩会突飞猛进,没想到还是不如从前 但是已经找到人工鼠标轨迹的程序,有待完善,接下来兵分四路:找特征.决策树.完善人工轨迹程序,使其可以将生成的数据自 ...

  9. php利用gd实现图片的边框

    <?php //实现两张图片合并 并内图片有一定的边框 $file = 'image/qr_1047.png'; $logo = 'image/logo_1047.jpg'; $code = ' ...

  10. VS2017专业版和企业版激活密钥

    VS2017专业版和企业版激活密钥 Professional: KBJFW-NXHK6-W4WJM-CRMQB-G3CDH Enterprise: NJVYC-BMHX2-G77MM-4XJMR-6Q ...