2021.6.24

这篇博客探讨了两个算法问题。第一个问题是关于仓库进货管理,通过差分前缀和解决进货后种类最多的仓库编号。第二个问题涉及棋盘上放置不同颜色棋子的最优化策略,利用容斥原理计算方案数。博主强调了解题思路,从简单到复杂,逐步求解复杂问题。
摘要由CSDN通过智能技术生成
  1. NC https://ac.nowcoder.com/acm/contest/17761/F

大意:现有 n 个仓库,编号 1到 n,当购进货物的时候,商家会把他们放到相邻的仓库中,当购货完毕后,输出种类最多的仓库的编号,若有多个输出编号最小的那个。n代表仓库的个数,m代表进货次数,接下来m行,每行三个数字 l,r,c 即放到仓库的左右端点和货物的种类。1<=n,m<=1e5, 1<=l,r<=n, 1<=c<=1e9.

思路: 从简单到复杂慢慢过渡,如果每次进货的货物种数不一样的话,显然可以用差分前缀和来做,所以我们想到把货物种数相同的存到一块,然后区间合并,然后就可以用差分+前缀合做了。种数最大数 1e9 所以用map 离散化。

总结:思考问题从简单到复杂慢慢过渡,一步一步来。

  1. NC https://ac.nowcoder.com/acm/contest/17761/D

在 n 行 m 列的棋盘放一些棋子,每个格子最多放一个棋子,且不同颜色的棋子不能让放在同一行或同一列,求最多有多少种方法。结果对 1e9+7 取模。输入第一行 n,m,c 代表行数和列数以及颜色数,接下来c个正整数,即每个颜色的棋子数,总数不超过 n * m。

思路:方案数?有限制的放棋子?是不是很熟悉?每个棋子具体放在哪个位置对方案数是没有影响的。因为每行每列不能出现颜色不一样的,按照棋子去状态转移是很复杂的,所以我们根据颜色去放棋子。

即 f[k, i, j] 表示前 k 种颜色,占了 i 行,j 列的放法,属性为方案数。

f[k,i, j] += f[k-1,a,b] * C(n-a, i-a) *C(m-b,j-b) * (把第 k 种颜色的棋子刚好放满 i-a行,j-b 列的方案数)

接下来就是怎么算 把 第 k 种的 棋子恰好放满 i-a 行,j-b 列,显然直接算是不行的,需要用到容斥原理。

我们开一个 g数组,先提前预处理出来,即g[k,i,j] 表示把 k 种棋子恰好放 i 行 j 列的方法。

显然 放 k 种 棋子 有 i 行 j 列 不放, 也可以用它表示。

所以 g[k,i, j]=总方案数 - 某行某列不放的方案数。即 g[k,i,j]=C(i*j, arr[k]) - g[k,x,y] * C(i,x) * C(j,y)

1<=x<i , 1<=y<j。

首先,需要将数据转换成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厂水质监测数据的趋势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值