#178-[暴力]数星星Stars

本文介绍了一种算法,用于解决给定一系列星星坐标后,如何统计每个星星的等级问题。星星的等级定义为在其左下方(包括正左和正下)的星星数量。文章通过示例解释了算法的实现过程,并提供了完整的代码示例。

Description

原题来自:Ural 1028 
天空中有一些星星,这些星星都在不同的位置,每个星星有个坐标。如果一个星星的左下方(包含正左和正下)有 kkk 颗星星,就说这颗星星是 k 级的。 
stars1.png 
例如,上图中星星 5是 3 级的(1,2,4 在它左下),星星 2,4 是 1 级的。例图中有 1 个 0 级,2 个 1 级,1 个 2 级,1 个 3 级的星星。 
给定星星的位置,输出各级星星的数目。 
一句话题意 \ 给定 n 个点,定义每个点的等级是在该点左下方(含正左、正下)的点的数目,试统计每个等级有多少个点。 

Input

第一行一个整数 N,表示星星的数目;
接下来 N 行给出每颗星星的坐标,坐标用两个整数 x,y 表示;
不会有星星重叠。星星按 y 坐标增序给出,y 坐标相同的按 x 坐标增序给出。 

Output

N 行,每行一个整数,分别是 0 级,1 级,2 级,……,N−1 级的星星的数目。 

5
1 1
5 1
7 1
3 3
5 5
  • Sample Input

1
2
1
1
0
  • Sample Output

HINT

对于全部数据,1≤N≤1.5×104,  0≤x,y≤3.2×104 

Source/Category

树状数组 // ???

数据范围......N^2应该能过

#include <iostream>
#include <cstdio>

#define SIZE 15010

using namespace std;

int x[SIZE], y[SIZE], c[SIZE];

int main(void)
{
	int n, i, j, tot;
	
	scanf("%d", &n);
	for (i = 1; i <= n; ++i)
	{
		scanf("%d%d", &x[i], &y[i]);
	}
	
	for (i = 1; i <= n; ++i)
	{
		tot = -1; // 一开始是 -1, 因为之后这颗星本身也被统计了.
		for (j = 1; j <= n; ++j)
		{
			if ((x[j] <= x[i]) && (y[j] <= y[i])) // 在左下方
			{
				++tot; // 计数器 + 1
			}
		}
		++c[tot]; // 级别个数 + 1
	}
	
	for (i = 0; i < n; ++i)
	{
		printf("%d\n", c[i]); // 输出
	}
	
	return 0;
}

 

import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 创建3D图形对象 fig = plt.figure(figsize=(8, 10)) ax = fig.add_subplot(111, projection=&#39;3d&#39;) # -------------------------- # 1. 生成圣诞树主体(圆锥体) # -------------------------- # 生成角度和高度数据 theta = np.linspace(0, 2 * np.pi, 100) z_tree = np.linspace(0, 8, 50) theta_grid, z_grid = np.meshgrid(theta, z_tree) # 圆锥体的半径随高度变化(上窄下宽) r_tree = (8 - z_grid) * 0.5 # 控制圣诞树的宽度比例 # 转换为3D坐标 x_tree = r_tree * np.cos(theta_grid) y_tree = r_tree * np.sin(theta_grid) # 绘制圣诞树主体(绿色) ax.plot_surface(x_tree, y_tree, z_grid, color=&#39;forestgreen&#39;, alpha=0.8, linewidth=0, antialiased=True) # -------------------------- # 2. 生成树干(圆柱体) # -------------------------- # 树干的参数 z_trunk = np.linspace(0, 1, 20) theta_trunk, z_trunk_grid = np.meshgrid(theta, z_trunk) r_trunk = 0.5 # 树干半径 # 转换为3D坐标 x_trunk = r_trunk * np.cos(theta_trunk) y_trunk = r_trunk * np.sin(theta_trunk) # 绘制树干(棕色) ax.plot_surface(x_trunk, y_trunk, z_trunk_grid, color=&#39;saddlebrown&#39;, alpha=0.9, linewidth=0, antialiased=True) # -------------------------- # 3. 添加装饰球 # -------------------------- # 装饰球的数量和位置 np.random.seed(42) # 固定随机种子,让装饰球位置固定 n_balls = 30 # 确保装饰球只在树冠部分(z > 1) ball_z = np.random.uniform(1.5, 7.5, n_balls) # 修改:从1.5开始,避免装饰球太低 ball_r = (8 - ball_z) * 0.45 * np.random.rand(n_balls) # 装饰球在树冠范围内 ball_theta = np.random.uniform(0, 2 * np.pi, n_balls) # 装饰球坐标 x_balls = ball_r * np.cos(ball_theta) y_balls = ball_r * np.sin(ball_theta) # 随机颜色(红、金、蓝、粉) colors = [&#39;red&#39;, &#39;gold&#39;, &#39;blue&#39;, &#39;pink&#39;] ball_colors = [colors[i % len(colors)] for i in range(n_balls)] # 绘制装饰球 ax.scatter(x_balls, y_balls, ball_z, c=ball_colors, s=50, alpha=0.9, edgecolors=&#39;white&#39;) # -------------------------- # 4. 添加星星(树顶) # -------------------------- # 修改:增加星星大小,使其更明显 ax.scatter(0, 0, 8.2, c=&#39;gold&#39;, s=300, marker=&#39;*&#39;, edgecolors=&#39;orange&#39;, linewidths=1) # -------------------------- # 5. 设置3D视图参数 # -------------------------- # 设置坐标轴范围 ax.set_xlim([-5, 5]) ax.set_ylim([-5, 5]) ax.set_zlim([0, 9]) # 隐藏坐标轴(更美观) ax.set_axis_off() # 修改:完全隐藏坐标轴,而不是只隐藏标签 # 设置背景色为白色 ax.set_facecolor(&#39;white&#39;) fig.patch.set_facecolor(&#39;white&#39;) # 设置视角 ax.view_init(elev=20, azim=45) # elev: 仰角, azim: 方位角 # 添加标题 plt.title(&#39;3D立体圣诞树&#39;, fontsize=18, pad=20, fontweight=&#39;bold&#39;) # 调整图形布局 - 使用subplots_adjust替代tight_layout plt.subplots_adjust(left=0, right=1, bottom=0, top=0.95) # 显示图形 plt.show()
最新发布
12-23
提供的代码整体逻辑清晰,功能实现完整,主要用于绘制一个 3D 立体圣诞树,且没有明显的语法错误,但有一些小的优化点和可以检查确认的地方。以下是详细分析: #### 1. 代码功能概述 代码通过 `matplotlib` 库的 3D 绘图功能,依次实现了圣诞树的主体(圆锥体)、树干(圆柱体)的绘制,并添加了装饰球和树顶星星,同时对 3D 视图进行了一些设置。 #### 2. 代码检查 ##### 语法和导入部分 ```python import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D ``` 这部分代码的导入语句是正确的,但 `Axes3D` 在较新的 `matplotlib` 版本中推荐使用 `fig.add_subplot(..., projection=&#39;3d&#39;)` 的方式创建 3D 坐标轴,代码使用此方式是正确的。 ##### 圣诞树主体(圆锥体)绘制 ```python # 生成角度和高度数据 theta = np.linspace(0, 2 * np.pi, 100) z_tree = np.linspace(0, 8, 50) theta_grid, z_grid = np.meshgrid(theta, z_tree) # 圆锥体的半径随高度变化(上窄下宽) r_tree = (8 - z_grid) * 0.5 # 控制圣诞树的宽度比例 # 转换为3D坐标 x_tree = r_tree * np.cos(theta_grid) y_tree = r_tree * np.sin(theta_grid) # 绘制圣诞树主体(绿色) ax.plot_surface(x_tree, y_tree, z_grid, color=&#39;forestgreen&#39;, alpha=0.8, linewidth=0, antialiased=True) ``` 这部分代码逻辑正确,通过参数方程生成圆锥体的 3D 坐标并使用 `plot_surface` 函数绘制。 ##### 树干(圆柱体)绘制 ```python # 树干的参数 z_trunk = np.linspace(0, 1, 20) theta_trunk, z_trunk_grid = np.meshgrid(theta, z_trunk) r_trunk = 0.5 # 树干半径 # 转换为3D坐标 x_trunk = r_trunk * np.cos(theta_trunk) y_trunk = r_trunk * np.sin(theta_trunk) # 绘制树干(棕色) ax.plot_surface(x_trunk, y_trunk, z_trunk_grid, color=&#39;saddlebrown&#39;, alpha=0.9, linewidth=0, antialiased=True) ``` 这部分代码也是正确的,同样使用参数方程生成圆柱体的 3D 坐标并绘制。 ##### 装饰球添加 ```python # 装饰球的数量和位置 np.random.seed(42) # 固定随机种子,让装饰球位置固定 n_balls = 30 # 确保装饰球只在树冠部分(z > 1) ball_z = np.random.uniform(1.5, 7.5, n_balls) # 修改:从1.5开始,避免装饰球太低 ball_r = (8 - ball_z) * 0.45 * np.random.rand(n_balls) # 装饰球在树冠范围内 ball_theta = np.random.uniform(0, 2 * np.pi, n_balls) # 装饰球坐标 x_balls = ball_r * np.cos(ball_theta) y_balls = ball_r * np.sin(ball_theta) # 随机颜色(红、金、蓝、粉) colors = [&#39;red&#39;, &#39;gold&#39;, &#39;blue&#39;, &#39;pink&#39;] ball_colors = [colors[i % len(colors)] for i in range(n_balls)] # 绘制装饰球 ax.scatter(x_balls, y_balls, ball_z, c=ball_colors, s=50, alpha=0.9, edgecolors=&#39;white&#39;) ``` 代码逻辑清晰,通过随机数生成装饰球的位置和颜色,并使用 `scatter` 函数绘制。 ##### 星星添加 ```python # 修改:增加星星大小,使其更明显 ax.scatter(0, 0, 8.2, c=&#39;gold&#39;, s=300, marker=&#39;*&#39;, edgecolors=&#39;orange&#39;, linewidths=1) ``` 这部分代码正确,使用 `scatter` 函数在树顶位置绘制星星。 ##### 3D 视图参数设置 ```python # 设置坐标轴范围 ax.set_xlim([-5, 5]) ax.set_ylim([-5, 5]) ax.set_zlim([0, 9]) # 隐藏坐标轴(更美观) ax.set_axis_off() # 修改:完全隐藏坐标轴,而不是只隐藏标签 # 设置背景色为白色 ax.set_facecolor(&#39;white&#39;) fig.patch.set_facecolor(&#39;white&#39;) # 设置视角 ax.view_init(elev=20, azim=45) # elev: 仰角, azim: 方位角 # 添加标题 plt.title(&#39;3D立体圣诞树&#39;, fontsize=18, pad=20, fontweight=&#39;bold&#39;) # 调整图形布局 - 使用subplots_adjust替代tight_layout plt.subplots_adjust(left=0, right=1, bottom=0, top=0.95) # 显示图形 plt.show() ``` 这部分代码对 3D 视图的坐标轴范围、背景色、视角、标题和布局进行了设置,代码本身没有问题。 #### 3. 优化建议 - **颜色管理**:可以将颜色定义为常量,方便后续修改和统一管理,例如: ```python TREE_COLOR = &#39;forestgreen&#39; TRUNK_COLOR = &#39;saddlebrown&#39; STAR_COLOR = &#39;gold&#39; STAR_EDGE_COLOR = &#39;orange&#39; BALL_COLORS = [&#39;red&#39;, &#39;gold&#39;, &#39;blue&#39;, &#39;pink&#39;] ``` - **函数封装**:将各个部分的绘制逻辑封装成函数,提高代码的可读性和可维护性,例如: ```python def draw_tree(ax): # 生成角度和高度数据 theta = np.linspace(0, 2 * np.pi, 100) z_tree = np.linspace(0, 8, 50) theta_grid, z_grid = np.meshgrid(theta, z_tree) # 圆锥体的半径随高度变化(上窄下宽) r_tree = (8 - z_grid) * 0.5 # 控制圣诞树的宽度比例 # 转换为3D坐标 x_tree = r_tree * np.cos(theta_grid) y_tree = r_tree * np.sin(theta_grid) # 绘制圣诞树主体(绿色) ax.plot_surface(x_tree, y_tree, z_grid, color=TREE_COLOR, alpha=0.8, linewidth=0, antialiased=True) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值