《程序员的算法趣题》-(日)增井敏克 , 书中为69 道数学谜题编写了解题程序, 编程语言为:Ruby,JavaScript,C语言。

Q18 水果酥饼日

  日本每月的 22 日是水果酥饼日。因为看日历的时候, 22 日的上方刚好是 15日,也就是“‘22’这个数字上面点缀着草莓”(如果将日语的 15 拆为 1 和 5发音,则与日语“草莓”一词发音相同,而水果酥饼中最为著名的就是草莓酥饼。)
 
  切分酥饼的时候,要求切分后每一块上面的草莓个数都不相同。假设切分出来的 N 块酥饼上要各有“1~N 个(共 N(N + 1)÷2 个草莓)”。但这里要追加一个条件,那就是“一定要使相邻的两块酥饼上的数字之和是平方数”。
  举个例子,假设 N = 4 时采用如 图的切法。这时,虽然 1 + 3 =4 得到的是平方数,但“1 和 4” “2和 3” “2 和 4”的部分都不满足条件。

问题
求可以使切法满足条件的最小的 N(N > 1)。

public class lb12_25_水果酥饼日 {public static int printMinN() {int N = 2;while (true) {int[] useList = new int[N - 1];for (int i = 2; i < N + 1; i++) {useList[i - 2] = i;}// 枚举4,9...平方数,事先计算平方数(最大值为n 的2 倍)int len = (int) (Math.sqrt(N * 2)) + 2;int sqrt[] = new int[len];for (int i = 0; i < len; i++) {sqrt[i] = (i + 1) * (i + 1);}if (check(1, useList, sqrt)) {break;}N += 1;}return N;}static List<Integer> list = new ArrayList<>();public static boolean check(int start, int[] useList, int[] sqrt) {for (int i = 0; i < useList.length; i++) {int number = useList[i];if (number == 0) {continue;}if (containsNum(number + start, sqrt)) {if (useList[useList.length - 1] == 14) {list.add(number);}useList[i] = 0;boolean isZero = true;for (int n : useList) {if (n != 0) {isZero = false;break;}}// 最后一个number跟1相加if (isZero && containsNum(number + 1, sqrt)) {return true;}if (check(number, useList, sqrt)) {return true;} else {// 还原被修改的useListuseList[i] = number;}}}return false;}public static boolean containsNum(int number, int[] sqrt) {for (int i = 0; i < sqrt.length; i++) {if (number == sqrt[i]) {return true;}}return false;}public static void main(String[] args) {System.out.println(printMinN());System.out.println(list);}}

参考:https://blog.csdn.net/cloudly89/article/details/84846650

LeetBook《程序员的算法趣题》Q18---水果酥饼日相关推荐

  1. php算法求出一个数可以被分解成多少个_程序员的算法趣题

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  2. 程序员的算法趣题Q25: 时髦的鞋带系法

    目录 1. 问题描述 2. 解题分析 2.1 状态表示方法 2.2 DFS 2.3 遍历下一个状态 2.4 交叉判断 3. 代码 4. 后记 1. 问题描述 即便系得很紧,鞋带有时候还是免不了会松掉. ...

  3. 程序员的算法趣题Q50: 完美洗牌

    目录 1. 问题描述 2. 解题分析 2.1 思路1 2.2 思路2 3. 代码及测试 4. 后记 1. 问题描述 问题:对2n张牌洗牌,并求当1<=n<=100时,一共有多少个n可以使得 ...

  4. 程序员的算法趣题Q09: 落单的男女

    目录 1. 问题描述 2. 解题分析 3. 代码及测试 4. 思考 1. 问题描述 人们聚集在某个活动会场上,根据到场顺序排成一排等待入场,活动的主办人员,想把人们从队列的某个位置分成两组,想要让分开 ...

  5. 程序员的算法趣题Q55: 平分蛋糕

    目录 1. 问题描述 2. 解题分析 2.1 初始算法流程 2.2 优化 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 这个题目第一感就是动态规划. 对于(m, n)形状(如下图所示, ...

  6. 程序员的算法趣题Q67: 不挨着坐是一种礼节吗?

    目录 1. 问题描述 2. 解题分析 2.1 基本思路 2.2 动态规划 2.3 算法流程 3. 代码及测试 4. 后记 1. 问题描述 注意,本问题不区分人,只考虑各个座位被占用的不同顺序的个数. ...

  7. 程序员的算法趣题Q68: 异性相邻的座位安排(1)

    目录 1. 问题描述 2. 解题分析 3. 代码及测试 4. 后记 1. 问题描述 这道题的描述应该是有问题的(不知道是原文的问题还是翻译的问题). 前面的描述中提到"前后左右的座位全是异性 ...

  8. 程序员的算法趣题Q57: 最快的联络网

    目录 1. 问题描述 2. 解题分析 2.1 学生的状态 2.2 学生状态转移 Case-T1:Do nothing, just wait Case-T2:给处于S0状态的学生打电话 Case-T3: ...

  9. 程序员的算法趣题:Q13 有多少种满足字母算式的解法(Java版)

    题目说明 所谓字母算式,就是用字母表示的算式, 规则是相同字母对应相同数字,不同字母对应不同数字, 并且第一位字母的对应数字不能是 0. 譬如给定算式 We * love = CodeIQ,则可以对应 ...

最新文章

  1. 数据导入报错:Got a packet bigger than‘max_allowed_packet’bytes的问题
  2. 数据结构实验4:C++实现循环队列
  3. 小工匠聊架构-超高并发秒杀系统设计 05_服务端性能优化
  4. 做一个公众号大概要多少钱_公众号流量主一个月可以赚多少钱?
  5. oracle_sqlserver和mysql获取表外键的方法_mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结...
  6. [转载]使用命名管道实现进程间通信
  7. 第 19 章 保护方法调用
  8. 关于代码调用SSP获取UserProfile出错的解决方案
  9. 团队成员的分应该怎么分?
  10. intra调用order
  11. 最佳的46+14款免费软件
  12. 计算机任务栏的透明颜色设置,教你电脑任务栏透明设置教程
  13. 论文写作—如何添加图注、公式、表注的序号,自动编号,交叉引用方式
  14. Markdown中LaTeX公式编号
  15. qq2007服务器中断,自动重启pubwin2007服务器脚本
  16. safari浏览器找不到服务器怎么办,IOS系统中Safari图标不见了怎么办 safari浏览器不见了找回方法图解...
  17. 红楼梦人物出场统计python_Python程序设计习题3——红楼梦人物出场次数统计
  18. WAS7和WAS8.5布署Axis2 webservice
  19. 使用Travis-CI自动部署博客
  20. continue和break跳出多层循环的问题

热门文章

  1. java .equal_Java中的equals()
  2. 服务器证书安装配置指南(IIS7)
  3. block,inline和inlinke-block细节对比
  4. NOIP2013/day1/1/转圈游戏
  5. URL Routing
  6. Remove Duplicates from Sorted Array II
  7. 使用VS2008在windows平台上试用Kinect
  8. 用 #inculde file = ../fiel 报1031错误
  9. linux内核驱动ldd3_手把手教Linux驱动7内核互斥锁
  10. HDFS的读写限流方案