挑战程序设计竞赛:反转法
挑战程序设计竞赛:反转法
- 1. 题目介绍
- 1.1 题目
- 1.2 样例
- 2. 思路讲解
- 2.1 视频讲解
- 2.1 反转法(开关问题)
- 3. 练习题
- 4. 附录:程序代码
- 4.1 Java
- 4.2 C++
- 5. 附录:拓展阅读
- 6. 参考资料
- 7. 免责声明
1. 题目介绍
1.1 题目
Face The Right Way (POJ No.3276)
N头牛排成了一列。每头牛或者向前或者向后。为了让所有的牛都面向前方,农夫约翰买了一台自动转向机器。这个机器在购买时必须设定一个数值K,机器每操作一次恰好使K头连续的牛转向。请求出为了让所有牛都能面向前方需要的最少操作次数M和对应的最小的K。
限制条件:
- 1 <= N <= 5000
1.2 样例
输入ff
N = 2ff
BBFBFBB(F: 面向前方,B:面向后方)
输出
K = 3
M = 3
2. 思路讲解
2.1 视频讲解
视频讲解总地址:传送门
- 题目介绍;
- 暴力解思路;
- 初始算法思路;
- 优化思路;
- 如何计算sum_pre & 例子讲解;
- 代码解析;
2.1 反转法(开关问题)
(摘抄自教材)区间反转的部分还是很容易进行优化的:
f[i]:=区间[i,i+K−1]进行了反转的话则为1,否则为0f[i] := 区间[i, i+K-1]进行了反转的话则为1,否则为0 f[i]:=区间[i,i+K−1]进行了反转的话则为1,否则为0
这样,在考虑第i头牛时,如果
∑j=i−K+1i−1f[i]\sum_{j=i-K+1}^{i-1}f[i] j=i−K+1∑i−1f[i]
为奇数的话,则这头牛的方向与起始方向是相反的,否则方向不变。由于
∑j=(i+1)−K+1if[j]=∑j=i−K+1i−1f[i]+f[i]+f[i−K+1]\sum_{j=(i+1)-K+1}^{i}f[j] = \sum_{j=i-K+1}^{i-1}f[i] + f[i] + f[i-K+1] j=(i+1)−K+1∑if[j]=j=i−K+1∑i−1f[i]+f[i]+f[i−K+1]
所以这个和每一次都可以用常数时间来计算,复杂度就降为O(N^2)。
3. 练习题
- Fliptile (POJ No.3279)
- The Water Bowls (POJ No.3185)
- Extended Lights Out (POJ No.1222)
4. 附录:程序代码
4.1 Java
- 程序代码:传送门
4.2 C++
从教材上面直接摘抄的代码,所以没有输入数据处理,只有解法,供有需要的童鞋参考。
// 输入
int N;
int dir[ MAX_N ]; // 牛的方向(0:F, 1:B)int f[ MAX_N ]; // 区间[i,i+K-1]是否进行反转// 固定K,求对应的最小操作回数
// 无解的话则返回-1
int calc( int K ) {memset( f, 0, sizeof( f ) );int res = 0;int sum = 0; // f的和for ( int i = 0; i + K <= N; i++ ) {// 计算区间[i,i+K-1]if ( ( dir[ i ] + sum ) % 2 != 0 ) {// 前端的牛面朝后方res++;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 res;
}void solve() {int K = 1, M = N;for ( int k = 1; k <= N; k++ ) {int m = calc( k );if ( m >= 0 && M > m ) {M = m;K = k;}}printf( "%d %d\n", K, M );
}
5. 附录:拓展阅读
- 挑战程序设计竞赛:尺取法
- 计算几何课堂:几何寻路之旅
- 超详细!红黑树详解文章汇总(含代码)
- 几何求交(一):直线和直线的交点
6. 参考资料
- 《挑战程序设计竞赛(第2版)》,(日)秋叶拓哉 等著,人民邮电出版社;
7. 免责声明
※ 本文之中如有错误和不准确的地方,欢迎大家指正哒~
※ 此项目仅用于学习交流,请不要用于任何形式的商用用途,谢谢呢;
挑战程序设计竞赛:反转法相关推荐
- 《挑战程序设计竞赛》之“反转”问题总结
<挑战程序设计竞赛>之"反转"问题总结 萌新又来写总结了 "反转"问题在<挑战程序设计竞赛>P150左右的位置~ 拒!绝!搜!索! 这类 ...
- 《挑战程序设计竞赛(第2版)》习题册攻略
本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...
- POJ 1150 The Last Non-zero Digit 《挑战程序设计竞赛》
为什么80%的码农都做不了架构师?>>> POJ 1150 The Last Non-zero Digit超大组合数:求超大组合数P(n, m)的最后一个非零位.4.1更加复杂 ...
- POJ 3735 Training little cats 题解 《挑战程序设计竞赛》
为什么80%的码农都做不了架构师?>>> POJ 3735 Training little cats调教猫咪:有n只饥渴的猫咪,现有一组羞耻Play,由k个操作组成,全部选自: ...
- POJ 3608 Bridge Across Islands 《挑战程序设计竞赛》
为什么80%的码农都做不了架构师?>>> POJ 3608 Bridge Across Islands跨岛大桥:在两个凸包小岛之间造桥,求最小距离?3.6与平面和空间打交道的计 ...
- 挑战程序设计竞赛(第2版)》
<挑战程序设计竞赛(第2版)> 基本信息 作者: (日)秋叶拓哉 岩田阳一 北川宜稔 译者: 巫泽俊 庄俊元 李津羽 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787 ...
- AOJ 1312 Where's Wally 题解《挑战程序设计竞赛》
为什么80%的码农都做不了架构师?>>> 本文由码农场 同步,最新版本请查看原文:http://www.hankcs.com/program/algorithm/aoj-131 ...
- ICPC程序设计题解书籍系列之三:秋田拓哉:《挑战程序设计竞赛》(第2版)
白书<挑战程序设计竞赛>(第2版)题目一览 白书:秋田拓哉:<挑战程序设计竞赛>(第2版) 第1章 蓄势待发--准备篇(例题) POJ1852 UVa10714 ZOJ2376 ...
- 挑战程序设计竞赛——详解DFS及BFS
挑战程序设计竞赛--详解DFS及BFS 一.学会要用到的stl函数,Stack.Quene.Pair 1.Stack(DFS隐式的用到,并与Queue对比记忆) 头文件==#include== sta ...
最新文章
- Java Persistence API中的FetchType LAZY和EAGER之间的区别?
- php5.3二进制包,php使用pack处理二进制文件的方法
- java 23种设计模式及具体例子 收藏有时间慢慢看
- 练习作品13:电子试卷自动生成软件
- Nginx支持比Apache高并发的原因
- UVA401 ​​​​​​​Palindromes【字符串】
- afl-fuzz技术白皮书
- 2017-2018-1 20155209 《信息安全系统设计基础》第一周学习总结
- 学校校车运营各项安全管理制度_廊坊市加强校车安全管理 确保师生生命安全...
- 如何保留小数点后任意一位数
- 绕过SQL注入限制的方法
- LeetCode Interview Qustions: Add Two Number
- python调用r语言函数_让R与Python共舞
- bitcoin rpc command
- 【读书有感】——你只是看起来很努力
- 分享一些正确的放松方式
- 机器学习(二)-朴素的贝叶斯分类
- JQuery对象与JavaScript对象的区别与转换
- 国密SM4加解密SM2签名验签COM组件DLL
- 使用Goods类创建十个商品 第四章 面向对象(上)课堂作业2
热门文章
- JAVA毕业设计花卉网站计算机源码+lw文档+系统+调试部署+数据库
- 分享几个好用的导航导航网站
- java基于微信小程序的驾校报名预约考试 uniapp小程序
- 2023年个人综合所得税汇算清缴来啦 自然人的补缴退税
- YARN - Task, Node manager, AppMaster, Resource manager 失败时所做的处理
- ppt中加载html,PPT页面中插入浏览器方法 PPT中插入浏览器教程-PPT家园
- Quartz入门教程
- RFID图书馆藏书防盗安全门门禁系统的应用分析
- Application Server was not connected Unable to ping server at localhost:1099
- 【VS消除警告】VS消除特定警告/安全函数警告C4996 strncpy unsafe……