鱼C论坛

 找回密码
 立即注册
楼主: zltzlt

[已解决]Python:每日一题 261

[复制链接]
发表于 2019-10-23 06:40:19 From FishC Mobile | 显示全部楼层
本帖最后由 阴阳神万物主 于 2019-10-23 07:03 编辑
Unicorn# 发表于 2019-10-23 00:12
这里是你的代码,加了时间测试
100个骰子列出所有情况,多次测试用时:
4.710269451141357


诶~居然是这样吗?不过小甲鱼不是说过吗?这种计时手段不精确啊,在计算单条语句执行用时的时候。

而且啊,依我看,实际上咱们的代码应该都是毫秒级的,到整秒的,用时啊应该还包括了系统的响应时间。所以,万一某次测试整个系统都卡住了,那么测出来的时间可能会相当长。
P.S.用一长串话来掩饰尴尬
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 10:57:33 | 显示全部楼层
  1. def dice_outcome(dice_num):
  2.     pro = [1] * 6
  3.     n = dice_num
  4.     d = 6**dice_num
  5.     res = []
  6.     while dice_num > 1:
  7.         media_list = [0] * (len(pro) + 5)
  8.         length = len(media_list)
  9.         for index in range(int(length / 2 + 0.5)):
  10.             if index > 5:
  11.                 start = index - 5
  12.             else:
  13.                 start = 0
  14.             for ele in pro[start:index + 1]:
  15.                 media_list[index] += ele
  16.             media_list[length - 1 - index] = media_list[index]
  17.         pro = media_list
  18.         dice_num -= 1
  19.     for num in pro:
  20.         res.append([n,round(num/d, 2)])
  21.         n += 1
  22.     return res

  23. print(dice_outcome(100))
复制代码

我这个好像蛮快的,但是不知道结果是否正确
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 11:48:11 | 显示全部楼层
Unicorn# 发表于 2019-10-22 22:13
我我我又来辽
想到可以用DP
哈哈哈以前机竞的内容还能用

小白求问DP是什么,全称?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 12:57:50 | 显示全部楼层
理清了顺序重写了
  1. def p(n):
  2.     arr=[[0]*(6*n+7) for i in range(n+1)]
  3.     arr[1][1:7]=[1]*6
  4.     for i in range(2,n+1):
  5.         for j in range(i-1,6*i-5):
  6.             for k in range(1,7):
  7.                 arr[i][j+k]+=arr[i-1][j]
  8.     return [[e,arr[n][e]/6**n] for e in range(n,6*n+1)]
复制代码

评分

参与人数 1荣誉 +1 贡献 +2 收起 理由
zltzlt + 1 + 2 没有鱼币了

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 12:59:43 | 显示全部楼层
Unicorn# 发表于 2019-10-23 00:04
3.813218116760254秒
我赢了

真的不用看赢不赢的,起码结果都没对啊,,,
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 14:15:30 From FishC Mobile | 显示全部楼层
塔利班 发表于 2019-10-23 12:59
真的不用看赢不赢的,起码结果都没对啊,,,

我的结果不对咩?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 14:17:12 From FishC Mobile | 显示全部楼层
danteer 发表于 2019-10-23 11:48
小白求问DP是什么,全称?

Dynamic Programing 动态规划
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 14:18:24 From FishC Mobile | 显示全部楼层
Unicorn# 发表于 2019-10-23 14:15
我的结果不对咩?

你先带2进去试试
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 14:20:21 From FishC Mobile | 显示全部楼层
阴阳神万物主 发表于 2019-10-23 06:40
诶~居然是这样吗?不过小甲鱼不是说过吗?这种计时手段不精确啊,在计算单条语句执行用时的时候。

...

事实上计算出结果很快,大概0.6秒左右,大部分时间花在了print上
两个函数用同样方式在同一台机器上测试出的结果当然是有说服力的
在这种问题上,DP的优势是显然的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 14:34:56 From FishC Mobile | 显示全部楼层
塔利班 发表于 2019-10-23 14:18
你先带2进去试试

啊啊啊好丢脸
我我一会回家就改
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 14:35:42 From FishC Mobile | 显示全部楼层
塔利班 发表于 2019-10-23 14:18
你先带2进去试试

思路应该没问题叭.......
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 14:52:33 | 显示全部楼层

不好意思!!!!!!
这里纠正了初始化的错误和单词的拼写错误
  1. def possibility(n):
  2.     f = []
  3.     for i in range(n+1):
  4.         f.append([])
  5.         for j in range(6*n+1):
  6.             f[i].append(0)
  7.     f[0][0] = 1
  8.     for var_n in range(1, n+1):
  9.         for var_s in range(var_n, 6*var_n+1):
  10.             for i in range(1, 7):
  11.                 f[var_n][var_s] += f[var_n-1][var_s-i]
  12.     ans = []
  13.     full = 6**n
  14.     for each in f[n][n:]:
  15.         ans.append([f[n].index(each),float(each)/full])
  16.     print(ans)
复制代码

输入2出现的全是0原因是 分子是整型,结果被强制转换成整型了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 14:52:55 | 显示全部楼层
Unicorn# 发表于 2019-10-23 14:35
思路应该没问题叭.......

只能说用DP没问题,那个对角线设置1不知道什么效果- -
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 14:54:50 | 显示全部楼层
塔利班 发表于 2019-10-23 14:52
只能说用DP没问题,那个对角线设置1不知道什么效果- -

哈哈哈只需要设置左上角是1就好啦
对角线当时想的是属于dp的边界
但是后来没有把它们设为边界,就出错啦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 14:55:32 | 显示全部楼层
Unicorn# 发表于 2019-10-23 14:54
哈哈哈只需要设置左上角是1就好啦
对角线当时想的是属于dp的边界
但是后来没有把它们设为边界,就出错 ...

应该是还有问题,回头你再看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 14:57:47 | 显示全部楼层
塔利班 发表于 2019-10-23 14:55
应该是还有问题,回头你再看看

之前存在两个问题:
对角元变大了导致数值错误
数据类型转化导致输出错误
已经改正啦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 15:12:10 | 显示全部楼层
Unicorn# 发表于 2019-10-23 14:20
事实上计算出结果很快,大概0.6秒左右,大部分时间花在了print上
两个函数用同样方式在同一台机器上测试 ...

哦,原来是这样啊,涨姿势了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 15:17:24 | 显示全部楼层
阴阳神万物主 发表于 2019-10-23 15:12
哦,原来是这样啊,涨姿势了。

能讲一下你的方法吗,没太看懂
能不用dp解决这个问题也是蛮厉害的
用数学排列组合又不列出具体事件,有点意思
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 16:10:20 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2019-10-23 16:13 编辑
Unicorn# 发表于 2019-10-23 15:17
能讲一下你的方法吗,没太看懂
能不用dp解决这个问题也是蛮厉害的
用数学排列组合又不列出具体事件,有 ...


其实吧,我的思路,用小数来说明是非常困难的,所以我就用分数来说明了。(在草稿上本来就是用分数在表示。)
为了看着方便,我就用分布列来表示了。
x(n = 1时的点数和) 12
3
4
5
6
p(概率) 1/6 1/6 1/6 1/6 1/6 1/6

然后
x(n = 2时的点数和)2=1+13 =1+2=2+1
4
5
6
7
8
9
10
11
12
p(概率) (1/6)*(1/6)=1/362*((1/6)^2)=2/36
3/36
4/36
5/36
6/36
5/36
4/36
3/36
2/36
1/36

就是这样的规律,分子是该点数出现的所有可能,分母是所有的情况。
我所做的只不过是,取了个巧,分步相乘:无非就是把分母扩大为相应的数;分类相加:无非就是把分子逐个加到相应的数。

P.S. 要不是题目要求输出的是小数,我都想用分数来表示了,毕竟我对用e表示数字不是很敏感。

评分

参与人数 1贡献 +1 收起 理由
zltzlt + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 16:39:04 | 显示全部楼层
小白瑟瑟发抖   需要多久才可以像你们一样优秀
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-13 19:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表