商店卖西瓜 10斤c语言,算法,西瓜切十刀,最多是多少块?

这篇博客探讨了一个有趣的数学问题:在三维空间中,一个西瓜切10刀最多可以切成多少块。通过递归公式和几何原理,博主推导出在不移动西瓜的情况下,10刀最多能切出176块。同时,博主还提到了在不同维度空间下的切西瓜问题,并给出了Python代码实现。文章涉及了算法、数学和空间想象能力的结合。
摘要由CSDN通过智能技术生成

刚出道面试过一到算法题目,

一个西瓜,保持形状不变,切10刀最多切多少块!

回复内容:

帮你搜到一个答案:

一个西瓜切100刀最多能分成多少块?说明为什么.

你这个问题的本质是n个平面最多可以把空间划分成多少块.我们来看如下三个问题:

1) n个点最多可以把一条直线划分成多少段.通项公式记为A(n)

2) n条直线最多可以把平面划分多成个区域.通项公式记为B(n)

3) n个平面最多可以把空间划分多少块.通项公式记为C(n)

第一个问题,很简单,A(n)=n+1

第二个问题,假设平面上已有n条直线它们把平面划分成最多的区域,那么第n+1条直线下去的时候,为了保证获得最多的区域,那么要求这条直线和之前的n条直线都相交,并且新产生的交点不和之前的交点重合.显然第n+1条直线和之前的n条直线产生n个交点,这n个交点把第n+1条直线划分成A(n)段,每一段都将原来的区域一分为二,于是B(n+1)=B(n)+A(n),将B(1)=2,A(n)=n+1带入很容易求得B(n)=[n(n+1)/2]+1

第三个问题,同理考察第n+1个平面下去多增加了多少块.前面的n个平面都和第n+1个平面相交,在第n+1个平面上留下n条交线,这n条交线最多将第n+1个平面划分成B(n)个区域,每个区域都将原来的块一分为二,于是C(n+1)=C(n)+B(n),将C(1)=2,B(n)=[n(n+1)/2]+1带入可以求得C(n)=[(n^3+5n)/6]+1

提示:利用以下求和公式:

1+2+...+n=n(n+1)/2

1^2+2^2+...+n^2=n(n+1)(2n+1)/6

将n=100带入C(n)得C(100)=166751 如果刀是直的,且是10维空间的西瓜,答案是1024。三维空间也是么? 用刀背切,块数比较多,不过不容易算。。 那些说1024的,都是在中途动了西瓜,或者是十维空间的西瓜。

在不移动西瓜的情况下,第四刀怎么着也切不出16块来。 不懂算法,

但我感觉,第n刀如果与前n-1刀全部相交,这应该是最多块的情况,

1+(1/2)(n(n+1))

56

好吧,这似乎是二维的西瓜, 10刀在各个维度下最多能切出的块数:

1维:11

2维:56

3维:176

4维:386

5维:638

6维:848

7维:968

8维:1013

9维:1023

10+维:1024

一般地:

equation?tex=n刀在

equation?tex=k维空间下最多可以切出的块数为

equation?tex=n次二项式展开的前

equation?tex=k%2B1项系数和(没有的项补0)。

比如3刀在二维空间下最多切出1+3+3=7块。 我的第一反应是用『贪心算法』,不知道对不对。 二的十次幂

1024 用刀面一拍就完美了,

好吧说笑,接下来是正解。

答主的题目意思不太清楚,没有限定是否可以在切的过程中移动西瓜

1.可以。

那答案前面各路大仙已经说了,10^10=1024

2.不可以。

这个时候就需要小学奥数发功了(小学入坑,考过杭州市34,但对于各路大神来说太差了)

0刀:1块

1刀:2块(废话)

2刀:4块

3刀:8块(切成二阶魔方的形状)

看到这而是不是很惊奇,因为似乎恰好事2^n?,这是因为3刀之内可以保证和每一个之前的平面切出的小块再切成两块

4刀:15块(可以自己试试,但是可以发现就是切不出16块)

这就是因为不能把之前的每个小块都一分为二。那么数列出来了

1,2,4,8,15

咳咳,我们来做个差

1,2,4,7

诶,这个好像也没有什么规律咋办?继续做差

1,2,3没错,这个数列就很完美了,差是1.

那么这样可以递推了

1,2,4,8,15,26,42,64,93,130,176

1,2,4,7,11,16,22,29,37,46,56,67

1,2,3,4,5,6,7,8,9,10

1,1,1,1,1,1,1,1,1,1

(下面一列作为上面一列的公差,并且依次向上)[经知友提醒,把最后一列1111111补上去了]

所以答案应该是176 [email protected] 我写了Python的算法实现。

代码如下:

def A(n):

return n+1

def B(n):

if n==1:

return 2

return B(n-1)+A(n-1)

def C(n):

if n==1:

return 2

return B(n-1)+C(n-1)

print str(C(10))

微信

分享

相关标签:

本文原创发布php教程 ,转载请注明出处,感谢您的尊重!

上一篇:为什么有些编程语言的数组要从零开始算?

下一篇:Mathematica 能否成为取代 Python 乃至其他编程语言的程序设计语言?

相关文章

相关视频

在Django框架中运行Python应用全攻略

在Python的Django框架中创建和使用模版

python获取元素在数组中索引号的方法

浅谈python中截取字符函数strip,lstr...

算法,西瓜切十刀,最多是多少块?

PHP开发基础教程之简介

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
西瓜好坏的判断可以使用决策树算法,常见的决策树算法包括ID3、C4.5、CART等。以下是一个简单的基于CART算法的决策树示例,用于判断西瓜好坏: ```c #include <stdio.h> #define MAX_SAMPLES 10 // 训练数据 int x[MAX_SAMPLES][2] = { {0, 1}, {0, 1}, {1, 0}, {1, 1}, {1, 0}, {0, 1}, {0, 0}, {1, 0}, {0, 0}, {1, 0}, }; int y[MAX_SAMPLES] = {0, 0, 1, 1, 1, 0, 1, 1, 1, 1}; // 决策树节点 struct Node { int feature; // 分裂特征 int threshold; // 分裂阈值 int label; // 叶子节点标签 struct Node *left; // 左子树 struct Node *right; // 右子树 }; // 计算基尼指数 double calc_gini(int *samples, int n_samples) { int count[2] = {0}; for (int i = 0; i < n_samples; i++) { count[samples[i]]++; } double gini = 1.0; for (int i = 0; i < 2; i++) { double p = (double)count[i] / n_samples; gini -= p * p; } return gini; } // 计算基尼指数增益 double calc_gini_gain(int *samples, int n_samples, int feature, int threshold, int *left_samples, int *right_samples) { int n_left = 0, n_right = 0; for (int i = 0; i < n_samples; i++) { if (x[samples[i]][feature] <= threshold) { left_samples[n_left++] = samples[i]; } else { right_samples[n_right++] = samples[i]; } } double gini_gain = calc_gini(samples, n_samples); gini_gain -= (double)n_left / n_samples * calc_gini(left_samples, n_left); gini_gain -= (double)n_right / n_samples * calc_gini(right_samples, n_right); return gini_gain; } // 训练决策树 struct Node* train_tree(int *samples, int n_samples) { // 如果样本全属于同一类别,则直接返回叶子节点 int label = y[samples[0]]; int is_pure = 1; for (int i = 1; i < n_samples; i++) { if (y[samples[i]] != label) { is_pure = 0; break; } } if (is_pure) { struct Node *leaf = (struct Node*)malloc(sizeof(struct Node)); leaf->feature = -1; leaf->threshold = -1; leaf->label = label; leaf->left = NULL; leaf->right = NULL; return leaf; } // 选择最优分裂特征和阈值 int best_feature = 0, best_threshold = 0; double best_gini_gain = 0.0; int left_samples[MAX_SAMPLES], right_samples[MAX_SAMPLES]; for (int i = 0; i < 2; i++) { for (int j = 0; j < n_samples; j++) { int threshold = x[samples[j]][i]; double gini_gain = calc_gini_gain(samples, n_samples, i, threshold, left_samples, right_samples); if (gini_gain > best_gini_gain) { best_feature = i; best_threshold = threshold; best_gini_gain = gini_gain; } } } // 分裂样本并递归建树 struct Node *node = (struct Node*)malloc(sizeof(struct Node)); node->feature = best_feature; node->threshold = best_threshold; node->label = -1; node->left = train_tree(left_samples, n_samples * best_threshold / 10); node->right = train_tree(right_samples, n_samples * (10 - best_threshold) / 10); return node; } // 预测新样本 int predict(struct Node *root, int *sample) { while (root->label == -1) { if (sample[root->feature] <= root->threshold) { root = root->left; } else { root = root->right; } } return root->label; } int main() { // 训练决策树 int samples[MAX_SAMPLES]; for (int i = 0; i < MAX_SAMPLES; i++) { samples[i] = i; } struct Node *root = train_tree(samples, MAX_SAMPLES); // 预测新样本 int sample[2]; printf("请输入西瓜的色泽(0-青绿,1-乌黑,2-浅白): "); scanf("%d", &sample[0]); printf("请输入西瓜的根蒂(0-蜷缩,1-稍蜷,2-硬挺): "); scanf("%d", &sample[1]); int label = predict(root, sample); if (label == 0) { printf("这是个好西瓜!\n"); } else { printf("这是个坏西瓜!\n"); } return 0; } ``` 在上述代码中,我们使用CART算法训练了一个决策树,并用于判断新的西瓜好坏。其中,训练数据包括10个样本,每个样本有两个特征:色泽和根蒂,标签为0表示好西瓜,标签为1表示坏西瓜。在预测新样本时,需要输入西瓜的色泽和根蒂信息,程序会输出预测结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值