Weight Balls

Given a set of N balls and one of which is defective (weighs less than others), you are allowed to weigh with a balance 3 times to find the defective. Which of the following are possible N?

------------------------------------------------------------------

答案:ABCD

A. 12               B. 16                     C. 20                        D. 24         

 

梅氏砝码问题,<=27的都能称出来

----------------------------------------------------------------------------------------------------------------------------

 

梅氏砝码问题

有4个砝码,共重40克,现有一个天平,问这4个砝码分别为多少克?可以称出1-40克的重量。

----------------------------------------------------------------------------------------------------------------------------

 

这个在数学上叫做梅氏砝码问题,其叙述如下: 
若有n个砝码,重量分别为M1,M2,……,Mn,且能称出从1到(M1+M2+……+Mn)的所有重量,则再加一个砝码,重量为Mn+1=(M1+M2+……+Mn)*2+1,则这n+1个砝码能称出从1到 
(M1+M2+……+Mn+Mn+1)的所有重量。 

取n=1,M1=1,则可以依此类推出所有砝码的重量为: 
1,3,9,27,81,243,……
import numpy as np import matplotlib.pyplot as plt import networkx as nx from matplotlib.patches import Circle from scipy.spatial.distance import cdist from scipy.sparse import lil_matrix try: from sklearn.cluster import KMeans has_sklearn = True except ImportError: print("警告: scikit-learn 未安装,将使用简化的粒球生成方法") has_sklearn = False class GranularBallGraph: def __init__(self, points, n_clusters=10, overlap_threshold=0.1): self.points = points self.n_clusters = n_clusters self.overlap_threshold = overlap_threshold self.balls = [] self.graph = None def generate_granular_balls(self): """生成粒球 - 支持两种方式""" if has_sklearn and len(self.points) > self.n_clusters: # 使用K-Means聚类方法 kmeans = KMeans(n_clusters=self.n_clusters, random_state=0, n_init=10) labels = kmeans.fit_predict(self.points) self.balls = [] for i in range(self.n_clusters): cluster_points = self.points[labels == i] if len(cluster_points) > 0: center = kmeans.cluster_centers_[i] radius = np.max(np.linalg.norm(cluster_points - center, axis=1)) self.balls.append((center, radius, cluster_points)) else: # 简化的粒球生成方法(不使用sklearn) print(f"使用简化的粒球生成方法(点数量: {len(self.points)})") self.balls = [] n = min(self.n_clusters, len(self.points)) indices = np.random.choice(len(self.points), n, replace=False) for idx in indices: center = self.points[idx] # 计算到最近点的距离作为半径 dists = np.linalg.norm(self.points - center, axis=1) dists.sort() radius = dists[min(5, len(dists) - 1)] # 取第5近的距离作为半径 self.balls.append((center, radius, self.points[dists <= radius])) def build_graph(self): """构建粒球图结构""" if not self.balls: print("错误: 未生成粒球,请先调用 generate_granular_balls()") return n_balls = len(self.balls) adj_matrix = lil_matrix((n_balls, n_balls), dtype=int) centers = np.array([ball[0] for ball in self.balls]) radii = np.array([ball[1] for ball in self.balls]) # 计算粒球中心间的距离 dist_matrix = cdist(centers, centers) # 判断粒球是否相交 for i in range(n_balls): for j in range(i + 1, n_balls): # 计算重叠比例 distance = dist_matrix[i, j] min_radius = min(radii[i], radii[j]) if min_radius > 0: # 防止除以零 overlap_ratio = (radii[i] + radii[j] - distance) / min_radius if overlap_ratio > self.overlap_threshold: adj_matrix[i, j] = 1 adj_matrix[j, i] = 1 # 创建NetworkX图 self.graph = nx.Graph() for i in range(n_balls): self.graph.add_node(i, center=centers[i], radius=radii[i]) for i in range(n_balls): for j in adj_matrix.rows[i]: if i < j: # 避免重复添加边 self.graph.add_edge(i, j) def visualize_2d(self, show_points=True, show_balls=True, show_graph=True): """可视化2D粒球图""" if self.points.shape[1] != 2: print("警告: 可视化仅支持2D数据") return plt.figure(figsize=(10, 8)) # 绘制原始点云 if show_points: plt.scatter(self.points[:, 0], self.points[:, 1], c='blue', s=10, alpha=0.6, label='点云') # 绘制粒球 if show_balls and self.balls: for i, (center, radius, _) in enumerate(self.balls): circle = Circle(center, radius, fill=False, edgecolor='red', alpha=0.4, linestyle='--') plt.gca().add_patch(circle) plt.text(center[0], center[1], f'B{i}', fontsize=9, ha='center', va='center') # 绘制图结构 if show_graph and self.graph: pos = {i: ball[0] for i, ball in enumerate(self.balls)} nx.draw(self.graph, pos, node_size=50, node_color='green', edge_color='gray', width=1.5, alpha=0.7) plt.title('粒球图 (Granular Ball Graph)') plt.xlabel('X') plt.ylabel('Y') plt.grid(alpha=0.3) plt.legend() plt.axis('equal') plt.show() def reconstruct_surface(self, resolution=0.1): """简单的表面重建(仅用于2D数据)""" if self.points.shape[1] != 2: print("警告: 表面重建目前仅支持2D数据") return if not self.balls: print("错误: 未生成粒球,请先调用 generate_granular_balls()") return # 创建网格 x_min, y_min = np.min(self.points, axis=0) x_max, y_max = np.max(self.points, axis=0) x = np.arange(x_min, x_max, resolution) y = np.arange(y_min, y_max, resolution) xx, yy = np.meshgrid(x, y) grid_points = np.c_[xx.ravel(), yy.ravel()] # 判断点是否在任意粒球内 surface_mask = np.zeros(len(grid_points), dtype=bool) for center, radius, _ in self.balls: dist = np.linalg.norm(grid_points - center, axis=1) surface_mask |= (dist <= radius) # 可视化重建表面 plt.figure(figsize=(10, 8)) plt.scatter(grid_points[surface_mask, 0], grid_points[surface_mask, 1], c='blue', s=1, alpha=0.3, label='重建表面') plt.scatter(self.points[:, 0], self.points[:, 1], c='red', s=15, alpha=0.7, label='原始点') # 添加粒球中心 centers = np.array([ball[0] for ball in self.balls]) plt.scatter(centers[:, 0], centers[:, 1], c='green', s=50, marker='x', label='粒球中心') plt.title('基于粒球图的表面重建') plt.xlabel('X') plt.ylabel('Y') plt.legend() plt.grid(alpha=0.3) plt.axis('equal') plt.show() # 示例用法 if __name__ == "__main__": # 生成示例点云数据(2D圆环) np.random.seed(42) n_points = 700 theta = np.linspace(0, 2 * np.pi, n_points) r = 5 + np.random.rand(n_points) * 2 points = np.c_[r * np.cos(theta), r * np.sin(theta)] noise = np.random.randn(n_points, 2) * 0.3 points += noise # 创建并构建粒球图 print("创建粒球图...") gbg = GranularBallGraph(points, n_clusters=10) gbg.generate_granular_balls() gbg.build_graph() # 输出信息 if gbg.balls: print(f"生成粒球数量: {len(gbg.balls)}") avg_radius = np.mean([ball[1] for ball in gbg.balls]) print(f"平均半径: {avg_radius:.2f}") if gbg.graph: print(f"图结构: {gbg.graph.number_of_nodes()} 个节点, {gbg.graph.number_of_edges()} 条边") # 可视化 gbg.visualize_2d(show_points=True, show_balls=True, show_graph=True) gbg.reconstruct_surface()
最新发布
07-22
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>双色球模拟开奖系统</title> <style> /* 核心样式 */ .container { text-align: center; margin: 20px auto; max-width: 800px; font-family: Arial, sans-serif; } .balls-container { margin: 20px; min-height: 60px; } .ball { display: inline-block; width: 40px; height: 40px; line-height: 40px; border-radius: 50%; margin: 5px; font-weight: bold; opacity: 0; transform: scale(0.5); transition: all 0.5s ease-out; } .ball.show { opacity: 1; transform: scale(1); } .red-ball { background: #ff4444; color: white; } .blue-ball { background: #4444ff; color: white; } #startBtn { padding: 12px 24px; font-size: 18px; background: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer; transition: background 0.3s; } #startBtn:hover { background: #45a049; } #startBtn:disabled { background: #cccccc; cursor: not-allowed; } </style> </head> <body> <div class="container"> <h2>🎱 双色球模拟开奖系统</h2> <button id="startBtn" onclick="startLottery()">开始摇号</button> <div class="result-area"> <div id="redBalls" class="balls-container"></div> <div id="blueBall" class="balls-container"></div> </div> </div> <script> // 红球生成算法(无重复) function generateRedBalls() { const balls = new Set() while(balls.size < 6) { balls.add(Math.floor(Math.random() * 33) + 1) } return [...balls].sort((a,b) => a - b) } // 蓝球生成算法 function generateBlueBall() { return Math.floor(Math.random() * 16) + 1 } // 动画显示逻辑 function startLottery() { const btn = document.getElementById('startBtn') btn.disabled = true btn.textContent = '摇号中...' // 清空上次结果 document.getElementById('redBalls').innerHTML = '' document.getElementById('blueBall').innerHTML = '' // 生成新号码 const reds = generateRedBalls() const blue = generateBlueBall() // 红球逐个显示 reds.forEach((num, index) => { setTimeout(() => { const ball = document.createElement('div') ball.className = 'ball red-ball' ball.textContent = num.toString().padStart(2, '0') document.getElementById('redBalls').appendChild(ball) // 触发动画 setTimeout(() => ball.classList.add('show'), 10) }, 500 * index) }) // 蓝球延迟显示 setTimeout(() => { const ball = document.createElement('div') ball.className = 'ball blue-ball' ball.textContent = blue.toString().padStart(2, '0') document.getElementById('blueBall').appendChild(ball) setTimeout(() => { ball.classList.add('show') btn.disabled = false btn.textContent = '重新摇号' }, 10) }, 500 * reds.length + 1000) } </script> </body> </html> 以上面的代码为基础,增加以下功能:机选任意注并打出这些号码组合
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值