有关于毕导THU尴尬定理的代码实现

此篇文章灵感来自于毕导29号更新的视频,感兴趣的童鞋请戳这里:https://www.bilibili.com/video/BV1RT4y1j7pP

在视频当中,毕导向我们阐释了尴尬定理的含义,以及解决尴尬定理通式的传统计算机解决问题的分治方法,在这里就直接摆出递推式了


在这里,我用MATLAB加以实现,代码如下所示

m=50;%手动输入k的取值范围,假定是1至50个人上厕所
f=zeros(1,m);%初始化占位函数,全赋值为1
a=ones(1,m);%初始化坑位利用率函数,全赋值为1
f(1)=1;%1人入厕所,自然是一个坑
f(2)=1;
f(3)=2;
for i=[4:1:m]%输入递归函数
    if mod(i,2)~=0
        f(i)=2*f((i+1)/2)-1;
    else
        f(i)=f(i/2)+f((i/2)+1)-1;
    end
end

for i=[1:1:m]%计算坑位利用率函数
    a(i)=f(i)/i;
end

figure(1)

x=[1:1:m];
y=f(1:1:m);
plot(x,y);
xlabel('坑位数量')
ylabel('最多容纳人数')

figure(2)
x=[1:1:m];
y=a;
plot(x,y);
xlabel('坑位数量')
ylabel('坑位利用率')

 

我们来看一下效果如何:

结果是特别amazing 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是用Python实现Floyd算法代码,具体内容如下: ```python # -*- coding: utf-8 -*- # Created on Thu Jul 13 14:56:37 2017 # author: linzr ## 表示无穷大 INF_val = 9999 class Floyd_Path(): def __init__(self, graph): self.graph = graph self.n = len(graph) self.dist = [[graph[i][j] for j in range(self.n)] for i in range(self.n)] self.path = [[j for j in range(self.n)] for i in range(self.n)] self.floyd() def floyd(self): for k in range(self.n): for i in range(self.n): for j in range(self.n): if self.dist[i][j] > self.dist[i][k] + self.dist[k][j]: self.dist[i][j] = self.dist[i][k] + self.dist[k][j] self.path[i][j] = self.path[i][k] def get_path(self, start, end): path = [] while start != end: path.append(start) start = self.path[start][end] path.append(end) return path if __name__ == '__main__': graph = [[0, 1, INF_val, 1, 5], [9, 0, 3, 2, INF_val], [INF_val, INF_val, 0, 4, INF_val], [INF_val, INF_val, 2, 0, 3], [3, INF_val, INF_val, INF_val, 0]] floyd = Floyd_Path(graph) print(floyd.get_path(0, 2)) ``` 这段代码实现了Floyd算法,可以求出给定图中任意两点之间的最短路径。具体实现过程是:首先将图表示为一个n行n列的矩阵,矩阵中的元素(i,j)表示从节点i到节点j的距离dij,如果两点直接没有边相连,则相应的元素就是无穷(∞)。然后,通过三重循环遍历所有节点,更新每个节点之间的最短路径和路径信息。最后,可以通过get_path方法获取任意两点之间的最短路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值