题意:

N头牛排成了一列。每头牛或者向前或者向后。为了让所有的牛都面向前方,农夫约翰买了一台自动转向的机器。这个机器在购买时就必须设定一个数值K,机器每操作一次恰好使K头连续的牛转向。请求出为了让所有的牛都能面向前方需要的最少的操作次数M和对应的最小的K。

分析:

此类问题一般都考虑状态递推的思想,即考虑后一个状态能不能由前一个状态所确定。

如本题,就先假定如果转向第 i 个牛,则 i ~ i+K-1 头牛均转向。因此如果第一只牛是反向的,则必须将第一头牛转向才能使得第一头牛正向。

因此观察 n <= 5000 的范围,决定对K进行暴力枚举,O(n^2)的复杂度过题。从左向右,找到第一只反向的牛,进行翻转之后,再找到第二只,依次往下。此时需要注意,如果找到反向的牛进行翻转之后,再从该牛开始,将该牛之后的K-1只牛全都进行翻转,则复杂度将会变为O(n^3),因此此处需要进行优化。

我们需要维护一个数组f,f[i] == 0表示第i只牛没有进行翻转。再维护一个sum,当牛需要翻转时,sum++,当判断第i只牛的状态时,sum -= f[i-K],因为第 i - K 只牛不会对第i只牛造成影响.

【此处的 f 与 sum 的优化较为巧妙,需好好感受这种思想】

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#define rep(i,a,b) for(int i = a;i <= b;i++)
using namespace std;int s[5050],n,k,f[5050],m;int main()
{while(~scanf("%d",&n)){char sp;getchar();rep(i,1,n){scanf("%c",&sp);getchar();if(sp == 'B') s[i] = 1;else s[i] = 0;}m = 100000;rep(i,1,n){int cnt = 0;memset(f,0,sizeof f);int sum = 0;rep(j,1,n-i+1){if(j-i >= 1)sum -= f[j-i];if( (s[j]+sum) % 2 == 1 ){f[j] = 1;cnt++;sum += 1;continue;} else{f[j] = 0;continue;}}//   cout<<"i: "<<i<<" cnt: "<<cnt<<endl;int jud = 1;rep(j,n-i+2,n){if(j-i >= 1)sum -= f[j-i];//        cout<<"j: "<<j<<" sum: "<<sum<<endl;if((s[j]+sum)%2 == 1){jud = 0;}if(!jud) break;}if(!jud) continue;else{if(cnt < m){m = cnt;k = i;}}}printf("%d %d\n",k,m);}return 0;
} /*
75BBBFFFFFFBBBBBBBBBBBFFFBBBBFFBFFFFFFFBBBBBBBBBFBBBFFFFFFBFFFFFFFFFBBBBBBBBB
*/

【POJ 3276】【开关问题】Face The Right Way【暑期 No.4】相关推荐

  1. POJ 1830 开关问题 【01矩阵 高斯消元】

    任意门:http://poj.org/problem?id=1830 开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1 ...

  2. POJ 3185 开关问题

    题意 传送门 POJ 3185 题解 开关问题的原理是枚举小部分开关的翻转的状态,使余下开关都可以直接判断是否翻转.这里每一个开关会造成左右两个开关同时翻转,枚举最左侧一个开关是否翻转,此时能影响到它 ...

  3. POJ 1830.开关问题(高斯消元)

    题目链接 Solutin: 将每个开关使用的情况当成未知数,如果开关i能影响到开关j,那么系数矩阵A[j][i]的系数为1. 每个开关增广矩阵的值是开关k的初状态异或开关k的目标状态,这个应该很容易想 ...

  4. POJ 1830 开关问题 高斯消元

    题意:给你N个开关,其中某些开关之间是相互影响的,即一个开关控制多个,那么每个开关操作与否为一个变元,有N个变元,开关之间相互影响的系数设为1,否则为0,对模2高斯消元求解自由变元个数. #inclu ...

  5. poj 1830 开关问题

    开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9328   Accepted: 3754 Description ...

  6. POJ 3276 枚举+差分?

    题意: 思路: 先枚举一下k 贪心:如果当前是B那么就翻 差分一下序列 mod2 就OK了 //By SiriusRen #include <cstdio> #include <cs ...

  7. poj 1830 开关问题

    高斯消元. 自由元个数res,最后答案因为每个变量有0,1   状态所以ans=1<<res; #include<cstdio> #include<cstring> ...

  8. poj 1830 开关问题 高斯消元

    题目链接 高斯消元模板, 判断是否有解以及变元的数量. 1 #include <iostream> 2 #include <vector> 3 #include <cst ...

  9. POJ 3276 Face The Right Way 反转

    大致题意:有n头牛,有些牛朝正面,有些牛朝背面.现在你能一次性反转k头牛(区间[i,i+k-1]),求使所有的牛都朝前的最小的反转次数,以及此时最小的k值. 首先,区间反转的顺序对结果没有影响,并且, ...

  10. POJ 3279 Fliptile

    传送门:http://poj.org/problem?id=3279 Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissi ...

最新文章

  1. 谷歌旗下DeepMind开发出编程机器人,已达人类程序员平均水平!
  2. MavenAnt使用
  3. 【译】微软出品HashiCorp Terraform 和 Vault 系列视频
  4. boost::describe模块实现枚举转字符串的测试程序
  5. linux 8051 编译,[编译] 3、在Linux下搭建51单片机的开发烧写环境(makefile版)
  6. 从前,小夕种了一棵树
  7. QQ浏览器如何修改截屏快捷键?QQ浏览器修改截屏快捷键的方法
  8. MySql数据类型分析(银行家舍入法) Part3
  9. 宏碁推智能佛珠,修养心性也可数据化
  10. 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放...
  11. [置顶]       Web开发百宝箱——提升网站档次的时尚 jQuery 图片滚动插件
  12. 如何在 Mac 上修复丢失的鼠标光标?
  13. snmpwalk 命令_Snmpwalk命令行示例
  14. python视频教程唐学韬-《吐血整理》-顶级程序员书单集
  15. 金融行业网络安全等级保护测评指南
  16. 树莓派4b自带wifi_树莓派raspberry4B入坑指南 part-11 在命令行中设置wifi
  17. 聚宽数据(JQData)本地化解决方案:基于MongoDB
  18. 帆软(FineReport)报表学习——一个简单的报表
  19. Excel添加固定文本到开头的2种操作方法
  20. CSR867x — TWS模式音量调节的交互流程

热门文章

  1. Spring Boot入门(4)-事务管理
  2. Myeclipse修改代码提示框背景色
  3. python必须要记住的代码_好用到哭!请记住这20段Python代码
  4. fastjson 添加key value_采坑系列—fastjson
  5. 最小生成树:Kruskal算法
  6. 浮点型变量的误差问题
  7. python画图小实例_Python画高斯分布图形实例代码
  8. 【UVA10652】Board Wrapping(凸包+坐标旋转+多边形面积)
  9. cmd代码玩贪吃蛇_关于N行贪吃蛇回答的补充
  10. 阿里云云计算 38 PolarDB MySQL的数据管理