挑战程序设计竞赛:反转法

  • 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 视频讲解

视频讲解总地址:传送门

  1. 题目介绍;
  2. 暴力解思路;
  3. 初始算法思路;
  4. 优化思路;
  5. 如何计算sum_pre & 例子讲解;
  6. 代码解析;

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−1​f[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∑i​f[j]=j=i−K+1∑i−1​f[i]+f[i]+f[i−K+1]
所以这个和每一次都可以用常数时间来计算,复杂度就降为O(N^2)。

3. 练习题

  1. Fliptile (POJ No.3279)
  2. The Water Bowls (POJ No.3185)
  3. Extended Lights Out (POJ No.1222)

4. 附录:程序代码

4.1 Java

  1. 程序代码:传送门

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. 附录:拓展阅读

  1. 挑战程序设计竞赛:尺取法
  2. 计算几何课堂:几何寻路之旅
  3. 超详细!红黑树详解文章汇总(含代码)
  4. 几何求交(一):直线和直线的交点

6. 参考资料

  1. 《挑战程序设计竞赛(第2版)》,(日)秋叶拓哉 等著,人民邮电出版社;

7. 免责声明

※ 本文之中如有错误和不准确的地方,欢迎大家指正哒~
※ 此项目仅用于学习交流,请不要用于任何形式的商用用途,谢谢呢;


挑战程序设计竞赛:反转法相关推荐

  1. 《挑战程序设计竞赛》之“反转”问题总结

    <挑战程序设计竞赛>之"反转"问题总结 萌新又来写总结了 "反转"问题在<挑战程序设计竞赛>P150左右的位置~ 拒!绝!搜!索! 这类 ...

  2. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

  3. POJ 1150 The Last Non-zero Digit 《挑战程序设计竞赛》

    为什么80%的码农都做不了架构师?>>>    POJ 1150 The Last Non-zero Digit超大组合数:求超大组合数P(n, m)的最后一个非零位.4.1更加复杂 ...

  4. POJ 3735 Training little cats​ 题解 《挑战程序设计竞赛》

    为什么80%的码农都做不了架构师?>>>    POJ 3735 Training little cats调教猫咪:有n只饥渴的猫咪,现有一组羞耻Play,由k个操作组成,全部选自: ...

  5. POJ 3608 Bridge Across Islands 《挑战程序设计竞赛》

    为什么80%的码农都做不了架构师?>>>    POJ 3608 Bridge Across Islands跨岛大桥:在两个凸包小岛之间造桥,求最小距离?3.6与平面和空间打交道的计 ...

  6. 挑战程序设计竞赛(第2版)》

    <挑战程序设计竞赛(第2版)> 基本信息 作者: (日)秋叶拓哉 岩田阳一 北川宜稔 译者: 巫泽俊 庄俊元 李津羽 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787 ...

  7. AOJ 1312 Where's Wally 题解《挑战程序设计竞赛》

    为什么80%的码农都做不了架构师?>>>    本文由码农场 同步,最新版本请查看原文:http://www.hankcs.com/program/algorithm/aoj-131 ...

  8. ICPC程序设计题解书籍系列之三:秋田拓哉:《挑战程序设计竞赛》(第2版)

    白书<挑战程序设计竞赛>(第2版)题目一览 白书:秋田拓哉:<挑战程序设计竞赛>(第2版) 第1章 蓄势待发--准备篇(例题) POJ1852 UVa10714 ZOJ2376 ...

  9. 挑战程序设计竞赛——详解DFS及BFS

    挑战程序设计竞赛--详解DFS及BFS 一.学会要用到的stl函数,Stack.Quene.Pair 1.Stack(DFS隐式的用到,并与Queue对比记忆) 头文件==#include== sta ...

最新文章

  1. Java Persistence API中的FetchType LAZY和EAGER之间的区别?
  2. php5.3二进制包,php使用pack处理二进制文件的方法
  3. java 23种设计模式及具体例子 收藏有时间慢慢看
  4. 练习作品13:电子试卷自动生成软件
  5. Nginx支持比Apache高并发的原因
  6. UVA401 ​​​​​​​Palindromes【字符串】
  7. afl-fuzz技术白皮书
  8. 2017-2018-1 20155209 《信息安全系统设计基础》第一周学习总结
  9. 学校校车运营各项安全管理制度_廊坊市加强校车安全管理 确保师生生命安全...
  10. 如何保留小数点后任意一位数
  11. 绕过SQL注入限制的方法
  12. LeetCode Interview Qustions: Add Two Number
  13. python调用r语言函数_让R与Python共舞
  14. bitcoin rpc command
  15. 【读书有感】——你只是看起来很努力
  16. 分享一些正确的放松方式
  17. 机器学习(二)-朴素的贝叶斯分类
  18. JQuery对象与JavaScript对象的区别与转换
  19. 国密SM4加解密SM2签名验签COM组件DLL
  20. 使用Goods类创建十个商品 第四章 面向对象(上)课堂作业2

热门文章

  1. JAVA毕业设计花卉网站计算机源码+lw文档+系统+调试部署+数据库
  2. 分享几个好用的导航导航网站
  3. java基于微信小程序的驾校报名预约考试 uniapp小程序
  4. 2023年个人综合所得税汇算清缴来啦 自然人的补缴退税
  5. YARN - Task, Node manager, AppMaster, Resource manager 失败时所做的处理
  6. ppt中加载html,PPT页面中插入浏览器方法 PPT中插入浏览器教程-PPT家园
  7. Quartz入门教程
  8. RFID图书馆藏书防盗安全门门禁系统的应用分析
  9. Application Server was not connected Unable to ping server at localhost:1099
  10. 【VS消除警告】VS消除特定警告/安全函数警告C4996 strncpy unsafe……