CodeForces 604C 【思维水题】`
2015-12-16 15:04
253 查看
题意:
给你01字符串的长度再给你一个串。
然后你可以在这个串中选择一个起点和一个终点使得这个连续区间内所有的位取反。
求:
经过处理后最多会得到多少次01变换。
例如:0101是4次,0001是2次,000110是3次。
分析:
区间内部的数目是不会发生变化的,因为每一位都是按位取反,相当于都没变,唯一发生变化的是区间边缘,所以考虑到连续的两个或多个1或者0的时候在其中某处设置断点会使得变换次数增加,很容易理解当某处有两个连续点的时候变换次数增加1,因为一个区间只有两个端点所以变换次数最多增加两次。
——————————————————————————————————————————
以上是屌丝一开始的思维,所以开始写码....
代码过了...但是发现一个问题...
当连续的3个或者3个以上点的时候把区间设置在这些连续点的内部可以增加的变换次数直接+2...
再看屌丝自己的代码...奥发现代码跟原来的想法根本不一样,只是恰好在连续的三个或者三个以上的时候设置了正确的标志变量...
给你01字符串的长度再给你一个串。
然后你可以在这个串中选择一个起点和一个终点使得这个连续区间内所有的位取反。
求:
经过处理后最多会得到多少次01变换。
例如:0101是4次,0001是2次,000110是3次。
分析:
区间内部的数目是不会发生变化的,因为每一位都是按位取反,相当于都没变,唯一发生变化的是区间边缘,所以考虑到连续的两个或多个1或者0的时候在其中某处设置断点会使得变换次数增加,很容易理解当某处有两个连续点的时候变换次数增加1,因为一个区间只有两个端点所以变换次数最多增加两次。
——————————————————————————————————————————
以上是屌丝一开始的思维,所以开始写码....
代码过了...但是发现一个问题...
当连续的3个或者3个以上点的时候把区间设置在这些连续点的内部可以增加的变换次数直接+2...
再看屌丝自己的代码...奥发现代码跟原来的想法根本不一样,只是恰好在连续的三个或者三个以上的时候设置了正确的标志变量...
#include<stdio.h> int tmp[100500]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%1d",&tmp[i]); } int ans=1,ttt=1; bool ok=0,ook=0; for(int i=2;i<=n;i++) { if(tmp[i]==tmp[i-1]) { ttt++; if(ttt>=2)//代码的bug成了简化代码的手段... { if(!ok) ok=1; else ook=1; } } else { ttt=1; ans++; } } printf("%d\n",ans+ok+ook); }
相关文章推荐
- zzulioj--1775-- 和尚特烦恼1——是不是素数(素数水题)
- 实验二 作业调度模拟实验
- replay的意义
- android学习摘记——TabHost使用代码
- Android编程实现禁止系统锁屏与解锁亮屏的方法
- 使用ionic实现轮播效果
- 剑指offer系列之五十三:字符流中第一个不重复的字符
- Android下获取各种存储目录
- 内建模块:random
- linux的read命令
- 使用ionic实现轮播效果
- WPF自适应窗体实现小结
- Impala与Hbase整合用于ETL过程尝试(3)
- 黑马程序员_java入门
- oracle数据库的启动和关闭【转】
- QT的对象树机制,parent指针。
- android Tether 分析
- 跨域实例
- yahoo军规的思考
- jsp页面设置防止写EL表达式时中文乱码