2021.5.26

1.NC https://ac.nowcoder.com/acm/contest/16806/A

大意:有一个未知的数,现在我们要去猜它,猜n次,每次裁判会进行回答,‘+’代表比答案大,‘-’代表比答案小,’.'代表猜到了答案。但是这个裁判非常不靠谱,他自己都不知道回答的是错还是对的,问裁判做多可能有多少个回答是正确的?n<=1e5,每次猜的数都在int 的范围内并且是正数。

思路:怎么说呢?和正解就差一步,最后一步没想到。

首先题目表述是很抽象的,因为只看大了小了看不出什么。但是我们通过画一个数轴就会发现,

对于 x 和 ‘+’ 代表答案在 0~x, 对于 x和 ‘-’ 代表 答案 在 x~inf, 对于 x和 ‘.’ 代表答案是 x~x。

经过转化之后实际上就是在所有相互有交集的区间集合中,区间个数最多的那种的区间个数。也就是确定一个数,上述区间能覆盖这个数,找到能覆盖的区间个数最多的情况。对于区间、交集之类的问题,一直以为要用贪心去做,结果就没做出,对于这类问题,可以用差分前缀和去做。每得出一个区间,我们就把区间中的数加1,最后统计最大数,就是答案了。因为数据1e9,避免使用离散化,我们用 map来做。

总结:求相互有交集的区间集合中区间最多的个数,可以用差分来做。

扩展:另外一种思路:也是差一点做出,通过上述的分析,总共就只有三种区间,,(1)某个点(2)某个点到正无穷(3)从某个点到负无穷。

对于每个出现的点我们都存下来,然后遍历每个点,二分查找符合的区间,维护最大值。对于后两种区间,我们将开区间转化成闭区间,这样遍历点的时候就不需要特判了。

2.NC https://ac.nowcoder.com/acm/contest/16806/B

大意:

扩展题目:

每次猜两个数 x1,x2,保证两个数的奇偶性不同,每次猜测对应答案是离哪个数更近,但不告诉你具体是哪个数,猜了n次,问根据n次猜测能确定几个答案?例如在1-4中猜数:猜3次 分别是 (1,2) (2,3) (1,4) ,则能确定出两个答案。

对于目标数为 1:(1,2)回答是1,能确定出目标数字是1

对于目标数为 2:(1,2)回答是2,(2,3)回答是2,这时候能确定目标数字为2

对于目标数字 3: ( 1,2) 回答是2,(2,3)回答是3,(1,4)回答是4,但不能确定

对于目标数字4:同理,不能确定。

思路:总的来说,光看表述还是很抽象,所以我们考虑将题目信息转化;首先画一个数轴,对于数轴上两个数x1,x2(不妨令x1<x2),离其中一个数更近的数满足什么条件呢?通过数轴观察我们可以发现,是以 (x1+x2)/2 为分界点的,因为x1,x2奇偶性不同,所以分为两段 即x<= (x1+x2)/2 和x >= (x1+x2)/2+1。也就是说每次猜测我们会得到两种可能。当唯一确定某个目标数字y时,则必须同时存在 <=y 和 >=y。所以我们可以将所有的(x1+x2)/2标记右括号,(x1+x2)/2+1标记左括号,当某个数既有右括号又有左括号才能作为目标数字。值的注意的是,1~4个数字,本身也相当于有限制,即>=1,和<=4。注意和区间标记区分开。区分样例 两次猜测:(1,2)、(3,4)。

首先,需要将据转换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、付费专栏及课程。

余额充值