程序员的算法趣题Q67: 不挨着坐是一种礼节吗?
目录
1. 问题描述
2. 解题分析
2.1 基本思路
2.2 动态规划
2.3 算法流程
3. 代码及测试
4. 后记
1. 问题描述
注意,本问题不区分人,只考虑各个座位被占用的不同顺序的个数。
2. 解题分析
2.1 基本思路
每个人选座位时,首先看有没有“超空位”(两边都没有挨着人的空位暂称为“超空位”),如果有则优先从“超空位”中选取。如果没有超空位,则从空位中任选一个坐下(空位是一定有的,因为人数和座位数是相等的)。
由于车厢中的作为安排方式(对面两排),两头两位的座位有一边是一定不挨着人的。如何表达才最方便于实现呢?
借用棋盘问题中的围栏思想,将两排座位排成一排,但是两头和中间各插入一个dummy座位(不能坐人),这样连同dummy座位总共有15个,可以表达为长度为15的数组。Dummy座位置为”-1”表示不能坐人,正常座位初始化为“0”,被人占据了则复制为“1”。这样,判断一个正常座位是否为“超空位”,只要看它本身是否为0且两边都不是1(即为“0”或者“-1”)。
2.2 动态规划
考虑已经有k个座位被占了,从当前状态出发往后的剩下的(12-k)个座位被占的顺序数只与当前这个k个座位被占的状态有关,而与它们被占的顺序无关。因此这个可以用动态规划的策略来解决。本题考虑用top-down的方式(递归+memoization)来实现动态规划策略。
2.3 算法流程
算法流程如下:
3. 代码及测试
# -*- coding: utf-8 -*-
"""
Created on Sun Oct 17 10:52:39 2021@author: chenxy
"""import sys
import time
import datetime
import math
# import random
from typing import List
# from queue import Queue
# from collections import deque
import itertools as it
import numpy as npmemo = dict()def isFull(pos):return np.all(pos[1:7]) and np.all(pos[8:14])def search(pos):if tuple(pos) in memo:return memo[tuple(pos)]if isFull(pos):return 1cnt = 0hasSuperEmpty = False# Search super empty seatfor k in [1,2,3,4,5,6,8,9,10,11,12,13]:if pos[k]==0 and pos[k-1]!=1 and pos[k+1]!=1:pos[k] = 1cnt = cnt + search(pos)hasSuperEmpty = Truepos[k] = 0if not hasSuperEmpty:for k in [1,2,3,4,5,6,8,9,10,11,12,13]:if pos[k]==0:pos[k] = 1cnt = cnt + search(pos)pos[k] = 0memo[tuple(pos)] = cntreturn cntN = 12 # Can't modify currently
pos = np.zeros(N+3)
pos[N//2+1] = -1
pos[N+2] = -1tStart = time.perf_counter()
count = search(pos)
tCost = time.perf_counter() - tStart
print('count = {0}, tCost = {1:6.3f}(sec)'.format(count,tCost))
运行结果:count = 14100480, tCost = 0.032(sec)
4. 后记
轻松搞定。
跳过了前面一些题目先做这道,是因为浏览了一下“高级篇”中的题目,大多数题目想2~3分钟感觉没有头绪,先捏这种一看就觉得“顺眼”的软柿子捏一捏^-^。这种策略对于学习很重要,盲目地死磕一道题目花费太久时间容易产生挫折感从而打击学习的积极性。有些问题一时没有头绪,放在脑袋里供闲暇时间想一想说不定更容易突然就有什么灵感。。。
上一篇:Q66: 设计填字游戏
下一篇:Q68: 异性相邻的座位安排
本系列总目录参见:程序员的算法趣题:详细分析和Python全解
程序员的算法趣题Q67: 不挨着坐是一种礼节吗?相关推荐
- php算法求出一个数可以被分解成多少个_程序员的算法趣题
计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...
- 程序员的算法趣题Q68: 异性相邻的座位安排(1)
目录 1. 问题描述 2. 解题分析 3. 代码及测试 4. 后记 1. 问题描述 这道题的描述应该是有问题的(不知道是原文的问题还是翻译的问题). 前面的描述中提到"前后左右的座位全是异性 ...
- 程序员的算法趣题Q66: 设计填字游戏
目录 1. 问题描述 2. 解题分析 2.1 基本算法流程 2.2 连通性检查 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 与前面的Q32.Q59以及后面的Q68(碰巧先做了Q68) ...
- LeetBook《程序员的算法趣题》Q18---水果酥饼日
<程序员的算法趣题>-(日)增井敏克 , 书中为69 道数学谜题编写了解题程序, 编程语言为:Ruby,JavaScript,C语言. Q18 水果酥饼日 日本每月的 22 日是水果酥 ...
- 程序员的算法趣题Q50: 完美洗牌
目录 1. 问题描述 2. 解题分析 2.1 思路1 2.2 思路2 3. 代码及测试 4. 后记 1. 问题描述 问题:对2n张牌洗牌,并求当1<=n<=100时,一共有多少个n可以使得 ...
- 程序员的算法趣题Q09: 落单的男女
目录 1. 问题描述 2. 解题分析 3. 代码及测试 4. 思考 1. 问题描述 人们聚集在某个活动会场上,根据到场顺序排成一排等待入场,活动的主办人员,想把人们从队列的某个位置分成两组,想要让分开 ...
- 程序员的算法趣题Q55: 平分蛋糕
目录 1. 问题描述 2. 解题分析 2.1 初始算法流程 2.2 优化 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 这个题目第一感就是动态规划. 对于(m, n)形状(如下图所示, ...
- 程序员的算法趣题Q57: 最快的联络网
目录 1. 问题描述 2. 解题分析 2.1 学生的状态 2.2 学生状态转移 Case-T1:Do nothing, just wait Case-T2:给处于S0状态的学生打电话 Case-T3: ...
- 程序员的算法趣题:Q13 有多少种满足字母算式的解法(Java版)
题目说明 所谓字母算式,就是用字母表示的算式, 规则是相同字母对应相同数字,不同字母对应不同数字, 并且第一位字母的对应数字不能是 0. 譬如给定算式 We * love = CodeIQ,则可以对应 ...
最新文章
- ai条码插件免安装_ai条码插件2款下载|Barcode Toolbox插件+Barcode条码插件下载 - 偶要下载站...
- springmvc常用注解标签详解
- ActiveMQ的多节点集群
- SAP offline应用的flush按钮实现
- 通过地址访问 mysql_MySql通过ip地址进行访问的方法
- 求幂级数展开的部分和 (20 分)新鲜出炉!!!
- 每日英语:Foreign Tourists Skip Beijing
- dedecms sphinx 配置
- iOS集成支付宝H5支付实现跳转与回调的解决方案
- 【数据结构】八种常见数据结构介绍
- 欧拉回路 poj-1392 Ouroboros Snake
- 一锁知千秋,再和腾讯大佬的技术对话,我还是小看锁了!面试加分的答案都已安排
- mysql复制不了的文字怎么办_网页上的文字不能复制怎么办?
- spring听课一点+组成原理心得
- java小游戏 飞翔的小鸟,校园新手入门,分分钟带你玩转编程
- NanoPC-T4|Android-Q 色温调节
- 直播凸显内容优势 网易新闻月活过亿有”深”意
- opengl读取obj模型并绘制2.0
- sw槽钢插件_基于solidworks的槽钢构建有限元分析、优化设计及对有限元的展望
- CIR,CBS,EBS,PIR,PBS令牌桶概述
热门文章
- Linux下system () 函数详解简介
- 完美解决 手机软键盘遮挡问题
- 基于django的 md5加密
- tp-link无线路由与android手机无线连接设置指南,苹果手机(iPhone)无线连接TP-LINK路由器解决方案...
- C语言标准库深度整理
- linux 启动 grub 修复工具,当Ubuntu无法启动时,如何修复GRUB2?
- Thrift 小试牛刀
- 点任务栏不切换窗口_如何使您的任务栏按钮始终切换到最后一个活动窗口
- 小红书KOC和KOL这两者怎样进行投放?
- 从零开始部署Node.js服务至阿里云ECS服务器并通过express框架实现外网IP访问html项目