CodeForces-590A Median Smoothing
2015-10-28 10:30
211 查看
/************************************************ * Author :somniloquy * Created Time :2015/10/26 16:33:25 ************************************************/ #include <cstdio> #include <algorithm> #include <iostream> #include <cstring> using namespace std; const int n_max = 5e5 + 5; int num[n_max]; int sign[n_max]; //标记数组 标记最后不变的数字 int main(void) { int n; while(~scanf("%d", & n)) { for(int i = 0; i < n; i ++) scanf("%d", & num[i]); //输入 01 序列 int ans = 0; //ans初始 memset(sign, 0, sizeof(sign)); //标记初始 sign[0] = sign[n - 1] = 1; //起点 和 终点 不变 for(int i = 0; i < n - 1; i ++) //标记 连着两个0 或者 连着两个1 则这几个数最后不会变动 { if(num[i] == num[i + 1]) sign[i] = sign[i + 1] = 1; } int cur = 0; //移动光标 for(int i = 0; i < n; i ++) { if(sign[i]) //如果 sign[i] = 1 不做处理 cur = i; //cur随i移动 else { cur ++; int cnt_0 = 0, cnt_1 = 0; //记录中间01出现的个数 while(cur < n && !sign[cur]) //一直移动到下一个被sign = 1(即不能改变的数字)的地方 { if(num[cur] == 0) //记录0出现的个数 cnt_0 ++; else if(num[cur] == 1) //记录1出现的个数 cnt_1 ++; cur ++; } if(num[i - 1] == 1 && num[cur] == 1) //当可变子序列的两端同为1的时候 变化的最后结果就是1 for(int j = i; j <= cur - 1; j ++) num[j] = 1; else if(num[i - 1] == 0 && num[cur] == 0) //同为0的时候 for(int j = i; j <= cur - 1; j ++) num[j] = 0; else if(num[i - 1] == 1 && num[cur] == 0) //首端为1 末端为0 的时候 变化的最后结果就是 1全部前移 0全部后移 { for(int j = i; j <= i - 1 + cnt_1; j ++) num[j] = 1; for(int j = i - 1 + cnt_1 + 1; j <= cur - 1; j ++) num[j] = 0; } else if(num[i - 1] == 0 && num[cur] == 1) //首端为0 末端为1 的时候 { for(int j = i; j <= i - 1 + cnt_0; j ++) num[j] = 0; for(int j = i - 1 + cnt_0 + 1; j <= cur - 1; j ++) num[j] = 1; } ans = max(ans, max(cnt_0, cnt_1)); //总是取子序列变化的最大值 i = cur; //i直接移动到cur处 } } printf("%d\n", ans); for(int i = 0; i < n - 1; i ++) printf("%d ", num[i]); printf("%d\n", num[n - 1]); } return 0; }
题目:
就是给一段01序列。
之后首尾01保持不变。
其余都是取中位数在不断变化,例如1 0 1,排序后位 0 1 1 中位数是 1,所以 0 变成 1。
问最后需要经过几步变化使序列稳定(不能继续变化)。输出步数 和 最终稳定的序列。
题解:
这道题如果暴力会超时。必须找变化的规律,可以发现最后只要 连着两个00 或者 11 就不会改变,改变的只会是01交替出现的。
相关文章推荐
- Mysql zip(5.7.9)64位版安装配置
- 青春谁不糊涂4
- 查看mysql一些命令的数据库状态
- [LeetCode]45. Reverse Words in a String按单词翻转字符串
- JAVA获取随机数
- 六大安神汤
- Hadoop Streaming使用简介
- 单个工程中Spring+Mybatis连接多个数据库的配置(个人分享版本)
- ubuntu12.04 gedit出错:Failed to connect to the session manager
- SQlList数据库基础
- ubuntu 由于没有公钥,无法验证下列签名
- Beginning Auto Layout Tutorial in iOS 7: Part 2
- JS 图片上传兼容性问题(获取图片宽高兼容)
- Hadoop读写文件时内部工作机制是怎样的?
- 在服务器上用Fiddler抓取HTTPS流量
- 项目收尾管理 、知识产权管理
- Effective STL 第一章:容器(一)
- Inflate
- 《第一行代码》第二章/Toast,Menu,Intent
- .公司域名总量统计:12家域名商负增长 万网降幅最大