2021.6.6

  1. NC https://ac.nowcoder.com/acm/contest/17085/E

大意:有n个景点,m条轨道将某些景点连接起来,每个景点有一个对应的高度,每次只能从某个景点去和它相连的并且高度不高于它的景点。并且可以随时随地回到之前走过的任意一个景点。求从1号景点开始的能走到的最多的景点的数量和最小距离和。1<=n<=1e5,1<=m<=1e6,1<=hi<=1e9

思路:首先很容易想到,对于最多的景点数,就是从1开始dfs,求连通块中点的个数,注意这里是不能用并查集求得,因为起点是确定的,只能从1开始。对于并查集求连通块是没有规定起点的。解决了访问到的最多景点个数的问题,接下来看怎么求最小距离和。首先如果没有高度限制的话就很容易,很简单嘛,最小生成树嘛。但是如果有高度的限制呢?就相当于变成了有向图,最小生成树是对于无向图的。这是还能不能用做最小生成树的算法做了呢?我们先来想想克鲁斯卡尔的算法原理:将边权从小到大排序,然后遍历,如果没有连通就将他们连通。我们这题就是多了高度的限制。其实也是可以做的,我们只需要将高度作为第一关键字排序从大到小,边权从小到大排序就行了,这样我们就确保了进行连通的时候是从先连的高度较高的点,这样就不会出现走到了高度较低的点,但是有高度较高的点却走不了了。我们要先确保景点总数最多,然后才是距离最小。

总结:(1)理解了算法的原理,才能做变形。(2)克鲁斯卡尔算法的原理。(3)dfs和并查集求连通的点的数量的区别。

  1. NC https://ac.nowcoder.com/acm/contest/17085/C

大意:有1个容量为v的背包,有n个物品,每一个物品有一个价值 ai,以及体积bi,现在不是要 求不超过背包容量的最大价值,而是需要求不超过背包容量选确定的m个中位数最大值,(m为偶数是,中位数为中间的两个值平均值,下取整)。(n ≤ 1e5, 1 ≤ m ≤ n, ai ≤ 1e9, v ≤ 1e9, bi ≤ v)

思路:一般的有关中位数问题很多情况下与堆、二分、排序有关。

首先根据数据范围很明显不是背包问题了。因为要求中位数,很容易想到先将价值排个序。对于m为奇数,也就是中位数前面有m/2个数,后面有m/2个数,并且是他们的价值尽可能的小,也就是枚举中位数,维护符合条件的最大值就行了。显然对于每次排序计算是会超时的。接下来就是堆的常用操作了,用堆预处理出任意一个位置作为中位数,前面选m/2个体积和的最小值以及后面选m/2个体积之和的最小值。即每次往后移动一个位置就和堆顶比较,如果比堆顶小就更新,如果比堆顶还大,那么就一定不会更新。预处理完成之后通过遍历每个位置作为中位数,维护满足条件的最大值就行了。对于m为偶数的情况,因为要选择中间两个数的平均值尽可能大,这样的要怎么做呢?显然枚举两个数是不行的,时间复杂度o( n 2 n^2 n2),但是如果我们确定了两个数中的前面那一个,那么对于后面那个一定是越靠后越好,也就变成了找符合条件的起点尽可能靠后的m/2个,显然通过预处理出前面m/2-1 和后面m/2,对于后面的m/2个的查找是可以二分的。

总结:(1)有关中位数的问题很多与堆、排序、二分有关。(2)用堆可以动态维护选择固定个数物品的最值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先,需要将数据转换成pandas的DataFrame格式,代码如下: ```python import pandas as pd data = {'日期/项目(A厂)': ['2021.1.1', '2021.1.2', '2021.1.3', '2021.1.4', '2021.1.5', '2021.1.6', '2021.1.7', '2021.1.8', '2021.1.9', '2021.1.10', '2021.1.11', '2021.1.12', '2021.1.13', '2021.1.14', '2021.1.15', '2021.1.16', '2021.1.17', '2021.1.18', '2021.1.19', '2021.1.20', '2021.1.21', '2021.1.22', '2021.1.23', '2021.1.24', '2021.1.25', '2021.1.26', '2021.1.27', '2021.1.28', '2021.1.29', '2021.1.30', '2021.1.31'], '进水': [149, 164, 86, 164, 146, 136, 93, 96, 90, 134, 141, None, None, None, 138, 138, 161, None, None, None, None, None, None, None, None, None, 114, 107, 121, None, None], 'COD': [20.1, 10.1, 37.1, 16.4, 10.9, 18.7, 17.2, 17.1, 18.5, 23.8, 17.7, 15.6, 11.0, 19.5, 18.5, 15.2, 16.5, 16.3, 17.3, 29.5, 20.7, 19.5, 18.9, 12.0, 23.9, 11.7, 10.6, 11.1, 14.2, 10.6, 12.5], '氨氮': [3.54, 0.65, 1.92, 1.44, 0.84, 1.59, 1.15, 1.61, 1.42, 2.46, 2.50, 1.48, 1.04, 3.55, 1.60, 1.82, 2.60, 2.10, 1.54, 3.54, 2.67, 3.25, 2.12, 2.38, 2.34, 1.51, 1.58, 1.31, 1.66, 1.26, 1.71], '总磷': [30.7, 20.1, 44.1, 21.5, 18.4, 29.7, 23.5, 24.2, 26.9, 31.7, 28.3, None, None, 24.0, 26.9, 27.8, 20.5, 27.9, 31.8, 37.8, 24.9, 29.3, None, 23.4, 23.5, 12.4, 27.9, 19.3, 17.6, 19.5, 15.4]} df = pd.DataFrame(data) ``` 接下来,我们可以使用matplotlib库进行数据可视化,这里我选择绘制折线图。代码如下: ```python import matplotlib.pyplot as plt # 设置图形大小 plt.figure(figsize=(10, 6)) # 绘制折线图 plt.plot(df['日期/项目(A厂)'], df['进水'], label='进水') plt.plot(df['日期/项目(A厂)'], df['COD'], label='COD') plt.plot(df['日期/项目(A厂)'], df['氨氮'], label='氨氮') plt.plot(df['日期/项目(A厂)'], df['总磷'], label='总磷') # 添加标题和标签 plt.title('A厂水质监测', fontsize=16) plt.xlabel('日期', fontsize=12) plt.ylabel('含量', fontsize=12) # 添加图例 plt.legend() # 显示图形 plt.show() ``` 运行上述代码,即可得到一张含有4条曲线的折线图,用于展示A厂水质监测数据的趋势。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值