CJOJ 1308 【HNOI 2002 】营业额统计 / CodeVS 1296 营业额统计(STL,二分)
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,二分)的更多相关文章
- Splay树-Codevs 1296 营业额统计
Codevs 1296 营业额统计 题目描述 Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司 ...
- CodeVS 1296 营业额统计
1296 营业额统计2002年 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description Tiger最近被公司升任为营业部经理, ...
- AC日记——营业额统计 codevs 1296 (splay版)
营业额统计 思路: 每次,插入一个点: 然后找前驱后继: 来,上代码: #include <cmath> #include <cstdio> #include <iost ...
- codevs 1296 营业额统计 (splay 点操作)
题目大意 每次加入一个值,并且询问之前加入的数中与该数相差最小的值. 答案输出所有相差值的总和. 解题分析 = = 参考程序 #include <bits/stdc++.h> using ...
- 【HNOI 2002】 营业额统计
[题目链接] 点击打开链接 [算法] 观察式子 : 最小波动值 = min{|该天营业额 - 之前某天的营业额|} = min{该天营业额 - 该天营业额的前驱,该天营业额的后继 - 该天营业额} 用 ...
- 二分法 codevs 1432 总数统计
codevs 1432 总数统计 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给出n个数,统计两两之和小于k的方 ...
- 网站每日PV/IP统计/总带宽/URL统计脚本分享(依据网站访问日志)
在平时的运维工作中,我们运维人员需要清楚自己网站每天的总访问量.总带宽.ip统计和url统计等.虽然网站已经在服务商那里做了CDN加速,所以网站流量压力都在前方CDN层了像每日PV,带宽,ip统计等数 ...
- PLSQL_统计信息系列05_统计信息的比较
20150506 Created By BaoXinjian
- PLSQL_统计信息系列02_统计信息的对象
20150505 Created By BaoXinjian
随机推荐
- sql备份(.bak文件备份)
第一步: 右键需要备份的数据库(这里以 MyDB 为例)-->任务-->备份
- 创建的docker容器时间显示错误/date错误/时区错误
前几天在测试应用的功能时,发现存入数据库中的数据create_time或者update_time字段总是错误,其他数据都是正常的,只有关于时间的字段是错误的. 进入linux服务器中查看,也没有任何的 ...
- springmvc 添加@ResponseBody
1.添加ResponseBody之后的话 返回字符串的时候 就是一个字符串. @RequestMapping(value = "/{bookId}/detail.do",metho ...
- Java 9 揭秘(4. 模块依赖)
文 by / 林本托 Tips 做一个终身学习的人. 在此章节中,主要学习以下内容: 如何声明模块依赖 模块的隐式可读性意味着什么以及如何声明它 限定导出(exports)与非限定导出之间的差异 声明 ...
- Elasticsearch VS Solr
最近公司用到了ES搜索引擎,调研发现大公司常用的搜索引擎还有Solr. 鉴于 Lucene 强大的特性和稳定性,有很多种基于 Lucene 封装的企业级搜索平台.其中最流行有两个:Apache Sol ...
- Java虚拟机14:Java对象大小、对象内存布局及锁状态变化
一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法.不过还好,在JDK1.5之后引入了Instrumentation类,这个 ...
- Azure 认知服务 (2) 计算机视觉API - 分析图像
<Windows Azure Platform 系列文章目录> 在上一节内容中,笔者介绍了微软认知服务的概览. 在本节中,笔者将详细介绍微软认知服务中的一种:计算机视觉 (Computer ...
- 14.Java中的Future模式
jdk1.7.0_79 本文实际上是对上文<13.ThreadPoolExecutor线程池之submit方法>的一个延续或者一个补充.在上文中提到的submit方法里出现了Future ...
- JS读写浏览器cookie及读取页面参数
JS读写浏览器cookie及读取页面参数 var zbrowser = { //设置浏览器cookie,exdays是cookie有效时间 setCookie: function (c_name, v ...
- jquery让页面滚动条top,滚动条 顶部
jquery让页面滚动条top,滚动条 顶部$(document).scrollTop(0);