【BZOJ】3427: Poi2013 Bytecomputer
题意:
给定一个长度为\(n\)的\(\{-1, 0, 1\}\)组成的序列,你可以进行\(x_i=x_i+x_{i-1}\)这样的操作,求最少操作次数使其变成不降序列。(\(n \le 1000000\))
分析:
我们考虑第\(i\)个数,如果\(x_i < x_{i-1}\),要想\(x_i \ge x_{i-1}\),那么\(x_i\)至少要加一次\(x_{i-1}\)才能大过\(x_{i-1}\)(当然\(x_{i-1} < 0\)那么永远不可能了)。
题解
然后我们猜测,最终的最优序列也一定由\(\\\{-1, 0, 1\\\}\)三个数组成。我们来证明一下:
假设第一个不是\(\\\{-1, 0, 1\\\}\)数的位置为\(p\),且假设\(p < n\),则容易知道\(x_p > 1\)。当\(x_{p+1} = -1\)时,我们要加2次才能大于等于\(x_p\),当\(x_{p+1}=0或1\)时,我们要加1次。而由于\(x_p > 1\),那么说明\(x_p\)也一定能够等于\(1\),这是因为\(x_{p-1}\)必然等于\(1\)(否则\(x_p\)就不会大于\(1\))。而当\(x_p=1\)时,对于\(x_{p+1} \in \\\{-1, 0, 1\\\}\)我们分别只需要加2次、加1次和加0次就能满足\(x_{p+1} \ge x_p\)。显然比\(x_p > 1\)要优。得证。
于是我们设\(d[i, j]\)表示前\(i\)个元素当前元素为\(j\)时的最少操作次数,然后推一下就行了..
#include <bits/stdc++.h>
using namespace std;
const int oo=~0u>>1;
int n, d[2][3];
int main() {
scanf("%d", &n);
int x; scanf("%d", &x);
int *now=d[0], *last=d[1];
last[0]=last[1]=last[2]=oo;
if(x==-1) last[0]=0;
if(x==0) last[1]=0;
if(x==1) last[2]=0;
for(int i=2; i<=n; ++i) {
scanf("%d", &x);
now[0]=now[1]=now[2]=oo;
if(last[0]!=oo) {
now[0]=last[0]+x+1;
if(x>=0) now[1]=last[0]+x;
if(x==1) now[2]=last[0];
}
if(last[1]!=oo) {
if(x==0) now[1]=min(now[1], last[1]);
if(x==1) now[2]=min(now[2], last[1]);
}
if(last[2]!=oo) {
now[2]=min(now[2], last[2]+1-x);
}
swap(now, last);
}
swap(now, last);
int ans=min(min(now[0], now[1]), now[2]);
if(ans==oo) puts("BRAK");
else printf("%d\n", ans);
return 0;
}
【BZOJ】3427: Poi2013 Bytecomputer的更多相关文章
- 【BZOJ】3052: [wc2013]糖果公园
http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
- 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...
- 【BZOJ】1013: [JSOI2008]球形空间产生器sphere
[BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...
- 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...
- 【BZOJ】【3083】遥远的国度
树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...
- 【BZOJ】【2434】【NOI2011】阿狸的打字机
AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...
- 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法
整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...
- 【BZOJ】【3170】【TJOI2103】松鼠聚会
切比雪夫距离+曼哈顿距离 题解:http://www.cnblogs.com/zyfzyf/p/4105456.html 其实应该先做这题再做[BZOJ][3210]花神的浇花集会的吧…… 我们发现d ...
随机推荐
- thinkphp 3.2与phpexcel
thinkphp版本:3.2 1.在http://phpexcel.codeplex.com/下载最新PHPExcel 2.把Classes目录下的文件(PHPExcel.php和PHPExcel文件 ...
- ajax方法简单实现
//option {url,medthod,type,data,fSuccess,fError} function ajax(option) { var xhr = window.XMLHttpRqu ...
- 获取APP最新版本的接口案例
思路: 开发初期.安卓的应用可能没有上传到应用市场,可以把应用apk放到服务器上,供用户下载.把对应用的版本信息整理成为一个XML文件,放到服务器上,通过接口读取xml文件,获取有版本信息,然后安卓端 ...
- Maven、SecureCRT使用问题汇集
1 Maven 无法下载pom文件中相关的依赖包 该问题可能有很多原因,我的原因是host中的localhost被修改了,改回来即可! 看起来好像出了一些网络原因的问题,顺着这个方向搜索,发现国外也有 ...
- AngularJS 技术总结
学习AngularJS,并且能在工作中使用到,算是很幸运了.因此本篇也会搜集各种资料,进行分享. 书籍分享 AngularJS权威指南 常用链接 AngularJS API文档 AngularJS 用 ...
- App- 借书趣
借书趣是一款方便用户在上海图书馆借书助手应用.通过扫描条码,导入豆瓣想读等手段可以方便管理想读想借的书目应用通过上图的接口和一些算法帮助用户生成借书单,规划用户可以去上图的哪个分馆可以借到最多想要阅读 ...
- javascript创建对象的一些方式
通过创建一个Object实例 var person = new Object(); person.name = "zhouquan"; person.age = 21; perso ...
- 利用session_set_save_handler()函数将session保存到MySQL数据库中
PHP保存session默认的是采用的文件的方式来保存的,这仅仅在文件的空间开销很小的windows上是可以采用的,但是如果我们采用uinx或者是liux上的文件系统的时候,这样的文件系统的文件空间开 ...
- PHP获取当前页面的URL
/** * 获取当前页面完整URL地址 * * @author 52php.cnblogs.com */ function http_get_page_url() { global $_G; if ( ...
- Java NIO工作原理
数据通信流程: 通过selector.select()阻塞方法获取到感兴趣事件的key,根据key定位到channel,通过channel的读写操作进行数据通信.channel的read或者write ...