POJ 3276 (变形尺取法)
来源:互联网 发布:php 魔术方法被淘汰了 编辑:程序博客网 时间:2024/04/30 01:59
题意:
n头牛,现在要求排列整齐并且方向一致F为前,B为向后,现在有一列牛,求出最少
的次数能把牛方向排列一致。每次只能去固定的牛一起转向。
思路:
如果是直接暴力,那么太麻烦的有至少O(N^3)的时间复杂度。
最好的思路是由之前的状态确定下一个状态,例如是从左向右遍历,如果是向后那么
这头牛必须要反转.因为反转的个数是固定的所以要记录之前的反转状态,记住这一点,便不难理解了。
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int M = 10000;int n,f[M],dir[M];int calc(int k){ memset(f,0,sizeof(f)); int ans = 0; int sum = 0; for(int i = 0;i + k <= n; i++) { if((dir[i] + sum)%2 != 0) { ans ++; f[i] = 1; } sum += f[i]; if(i - k + 1 >= 0) { sum -= f[i-k+1]; } } for(int i = n - k + 1;i < n; i++) { if((dir[i]+sum)%2 != 0) { return -1; } if(i - k + 1 >= 0) { sum -= f[i-k+1]; } } return ans;}int main(){ //freopen("in.txt","r",stdin); cin>>n; char str[M]; for(int i = 0;i < n; i++) { cin>>str[i]; } str[n] = '\0'; for(int i = 0;i < n; i++) { if(str[i] == 'F') dir[i] = 0; else dir[i] = 1; } int K = 1,M = n; for(int i = 1;i <= n; i++) { int m = calc(i); if(m >= 0 && M > m) { M = m; K = i; } } cout<<K<<" "<<M<<endl; return 0;}
0 0
- POJ 3276 (变形尺取法)
- POJ 3276 尺取法
- POJ-2566 Bound Found(尺取法变形)
- POJ-3276-尺取法,greedy
- POJ 3276 尺取法 反转问题
- 尺取法(POJ 3061,3320,3276)
- POJ 2566 尺取法
- poj 2100 尺取法
- POJ 2566 尺取法
- poj 3061 尺取法
- poj 3061 尺取法
- poj 2566 尺取法
- poj 3061 尺取法
- poj 3320 尺取法
- poj 3320 尺取法
- poj 2566 尺取法
- poj 3061 尺取法
- poj 3320 尺取法
- Sublime Text 3 搭建Python IDE
- 【OpenCV入门教程之十】 形态学图像处理(一):膨胀与腐蚀
- 如何向github库里上传自己的项目
- 1226
- android 获取versionName和versionCode以及作用
- POJ 3276 (变形尺取法)
- Mavlink-2-消息结构
- 为什么打开EXCEL表格会出现The setup controller has encounter
- JVM字节码指令 及 反编译分析
- maven 安装oracle ojdbc14 jar包
- Python Web开发--前言
- 期末预习计划
- Head First 之 代理模式(一)
- 单片机程序是如何执行的_单片机达人解密:指令数据写哪了?