01、关于满减优惠券可叠加使用场景下的动态规划算法
01、关于满减优惠券可叠加使用场景下的动态规划算法
之前在一家公司做停车业务,做优惠券相关的内容。有一期需求是关于满减优惠券可叠加使用场景下,为用户推荐最优的优惠券使用方案,特意在网上找了些资料学习,这里做个记录,方便学习。
后面在网上找到了类似的需求,放在了文章的最后,特别感谢原作者。
1、需求简介
需求描述为:支付停车费时,有多张满减优惠券可用(可叠加使用),求最优策略(减免最多)。
(相关资料图)
准确描述为:
设共有n张优惠券C: [(V1, D1), (V2, D2), (V3, D3), ..., (Vn, Dn)],其中Vn为面值,Dn为减免值(对于一张优惠券Cx,满Vx减Dx),优惠券为单张,可叠加使用(使用过一张后,如果满足面值还可以使用其他优惠券)。求停车费用为M时,使用优惠券的最优策略:1.减免值最多,2.优惠券剩余最优(比如对于 C1 (2, 0.1) 、C2 (1, 0.1) 只能选择一张的最优取舍就是用C1留C2 )。
示例:
输入:
C = [(2, 1.9), (1, 1), (1, 0.1), (2, 0.1)] , M = 3
期望输出:
使用优惠券:[(2, 0.1), (2,1.9), (1,1)]
总减免:3
满减优惠券可叠加使用的场景下的解决方案,可背包算法相似,通过 动态算法规划算法背包问题 学习了下背包的思想。顺便了解一下动态规划能解决什么问题:
适用动态规划方法求解的最优化问题应该具备的两个要素:最优子结构和子问题重叠。——《算法导论》动态规划原理
优惠券问题看起来和背包问题很像,但是有一点不同。
2、优惠券问题和背包问题的不同点
图中,背包问题里面的数据为:在负重已知的前提下能装物品的最优总价值;优惠券问题里面的数据为总金额能使用优惠券的最优总减免值。
对于背包问题,如果负重为4,策略只能是拿B号物品,因为拿取B号之后负重还剩(4-3=1),再拿不了A号物品了(最终价值为1.5);
对于优惠券问题,如果金额为4,使用完B号优惠券之后,金额还剩(4-1.5=2.5),还可以再用A号优惠券的(最终减免值为2.5)。
总结这个不同就是:
- 背包判断大于重量W,再减去W,得到剩余值,根据剩余值再去上一层找剩余值对应的值(统计价值),背包问题是减去重量W;
- 优惠券则是当总金额M大于面额V时,再减去减免值D,得到剩余的金额N,再根据金额N去上一层找对应的值(统计减免值D),优惠券问题是减去减免值D。
而且因为这个不同,优惠券问题的数据对优惠券顺序是有要求的,不像背包问题中,总是负重减物品重量,剩余的重量直接去找上次最优再计算就好了。顺序问题分两种:
3、优惠券的顺序问题
3.1 对于优惠券,不同面额的顺序
优惠券面额顺序对结果的影响
图中,将物品和券的顺序颠倒,对于背包问题,最后一行数据完全相同,对结果无影响;
对于优惠券问题,顺序变了结果会不一样。(因为需要满足优惠券(v,d), 中的v才能减去第二项,所以对顺序有要求)。
所以,不同面额 (V不同) 的优惠券,应该升序排列。
3.2 面额相同,减免值不同
优惠券面额相同,不同减免值的顺序对结果的影响
因为背包思想是通过上一次的结果来铺垫下一次的值,所以从上往下需要先生成同额度的最优值。
所以,同面额不同减免值 (V同D不同) 的优惠券,应该降序排列。
排序示例为:
[ (2, 1.9), (1, 1), (1, 0.1), (2, 0.1)]
需排列为:
[ (1, 1), (1, 0.1), (2, 1.9), (2, 0.1),]
综以上 一点不同两种顺序的情况所述,使用背包之前需要排序(V升D降),按V升序,如果V相同,再按D降序排。再使用背包算法(大于V减去D)。
对于上面的排序要求,我们知道,需要使用具有稳定性的排序算法,下面使用归并排序来进行计算。注意:排序算法一定要具有稳定性,否则无效。
4、程序实现
4.1 具有稳定性的排序算法
def merge(nums: list[int], left: int, mid: int, right: int) -> None: """ 合并左子数组和右子数组 """ # 左子数组区间 [left, mid] # 右子数组区间 [mid + 1, right] # 初始化辅助数组 tmp: list[int] = list(nums[left:right + 1]) # 左子数组的起始索引和结束索引 left_start: int = 0 left_end: int = mid - left # 右子数组的起始索引和结束索引 right_start: int = mid + 1 - left right_end: int = right - left # i, j 分别指向左子数组、右子数组的首元素 i: int = left_start j: int = right_start # 通过覆盖原数组 nums 来合并左子数组和右子数组 for k in range(left, right + 1): # 若“左子数组已全部合并完”,则选取右子数组元素,并且 j++ if i > left_end: nums[k] = tmp[j] j += 1 # 否则,若“右子数组已全部合并完”或“左子数组元素 <= 右子数组元素”,则选取左子数组元素,并且 i++ elif j > right_end or tmp[i] <= tmp[j]: nums[k] = tmp[i] i += 1 # 否则,若“左右子数组都未全部合并完”且“左子数组元素 > 右子数组元素”,则选取右子数组元素,并且 j++ else: nums[k] = tmp[j] j += 1def merge_sort(nums: list[int], left: int, right: int) -> None: """ 归并排序 """ # 终止条件 if left >= right: return # 当子数组长度为 1 时终止递归 # 划分阶段 mid: int = (left + right) // 2 # 计算中点 merge_sort(nums, left, mid) # 递归左子数组 merge_sort(nums, mid + 1, right) # 递归右子数组 # 合并阶段 merge(nums, left, mid, right)""" Driver Code """if __name__ == "__main__": nums: list[int] = [ 7, 3, 2, 6, 0, 1, 5, 4 ] merge_sort(nums, 0, len(nums) - 1) print("归并排序完成后 nums =", nums)
4.2 优惠券叠加算法
# coding:utf-8# 背包算法,解决满减优惠券叠加使用问题def coupon_bags(coupon, amount): """ 优惠券背包算法 param: coupon 优惠券数组 param: amount 金额 """ # 转换金额跨度(间隔): 元->角 span = 10 amount = int(amount*span) for i, v in enumerate(coupon): for j in range(len(v)): coupon[i][j] = int(coupon[i][j]*span) # 初始化结果数组,dps 存储满减值(背包算法结果) # dps_coupons 存储 dps 对应满减值下使用的 优惠券方案 dps = [] dps_coupons = [] # len(coupon)+1,这里为什么要加 1, # 记住 动态算法规划算法背包问题一文中的: dp[i][0] = dq[0][j]=0;原因就是这个 for i in range(len(coupon)+1): # 这里为啥是 amount+1,因为 dps 中的索引是从0开始的, # 索引0的位置处存的是金额0的满减值,所以这里需要 amount+1 dps.append(list((0,)*(amount+1))) # list 直接 * 生成的是同一list,用循环生成 dps_coupons.append([]) for j in range(amount+1): dps_coupons[i].append([]) for i in range(1, len(coupon)+1): # i 代表第 i 张优惠券,从 1 开始的 for j in range(1, amount+1): # j 代表的是 总金额M为:j # coupon[i-1][0] 代表的是优惠券的中的 V,即满 coupon[i-1][0] 减 coupon[i-1][1] if j < coupon[i-1][0]: # 金额j 达不到 满减的条件:V,取上一层对应位置的值 # 获取上个策略值 dps[i][j] = dps[i-1][j] dps_coupons[i][j] = dps_coupons[i-1][j] else: # 金额j 达到了 满减的条件:V # dps中的i代表的是第几张优惠券,j代表的是总金额为J时的最优满减值 # coupon[i - 1][1],代表的是:当前优惠券的减免值 # dps[i - 1][j - coupon[i - 1][1]],代表的是剩余金额对应的最优满减值 if dps[i - 1][j] > coupon[i - 1][1] + dps[i - 1][j - coupon[i - 1][1]]: # 上一行同列数据 优于 当前优惠券+剩余的金额对应的上次数据,取之前数据 dps[i][j] = dps[i-1][j] dps_coupons[i][j] = dps_coupons[i-1][j] else: # 选取当前+剩余 优于 上一行数据 dps[i][j] = dps[i-1][j-coupon[i-1][1]]+coupon[i-1][1] # dps_coupons[i-1][j-coupon[i-1][1]],值是list,需要拷贝,才不会影响之前的结果 dps_coupons[i][j] = dps_coupons[i-1][j-coupon[i-1][1]].copy() # 表示使用了第 i 张优惠券 dps_coupons[i][j].insert(0, list(coupon[i-1])) # 结果需返回数据原单位(元) result_coupons = dps_coupons[-1][-1].copy() for i, v in enumerate(result_coupons): for j in range(len(v)): result_coupons[i][j] = result_coupons[i][j]/span print(f"使用优惠券:{result_coupons} 总减免:{dps[-1][-1]/span}")# 优惠券coupon_items = [ [1, 1], [1, 0.1], [2, 1.9], [2, 0.1],]# 举例中的优惠券是最终顺序。确保优惠券已经排序过,多维升序(V升D降),此处省略coupon_bags(coupon_items, 3)"""coupon_items = [ [1, 0.6], [2, 0.7], [2, 1.3], [3, 2.3],]coupon_bags(coupon_items, 5)"""
dps,dps_coupons数据存储示意图
4.3 停车场优惠券叠加使用的场景
上面就是将上面两种算法结合在一起进行使用。
class CouponSort(object): """ 具有稳定性的归并排序 coupon_list: [[5, 1, 189], [6, 1, 200]] [5, 1, 189] --> 5: 总金额为5,1:减免值,189:此张优惠券对应数据库中的记录ID """ def __init__(self, coupon_list): tmp = coupon_list.copy() self.coupon_list = tmp self.length = len(coupon_list) def sort(self): left = 0 right = self.length self._merge_sort(left, right - 1, True) # 下面是当总金额M相同时,按照减免值降序排序 start, end, index = 0, 0, 0 while index != self.length: if index != self.length - 1: if self.coupon_list[index][0] != self.coupon_list[index + 1][0]: self._merge_sort(start, end, False) start = index + 1 end = start else: end += 1 else: self._merge_sort(start, end, False) index += 1 return self.coupon_list def _merge_sort(self, left, right, l2m): """ 归并排序 """ # 终止条件 if left >= right: return # 当子数组长度为 1 时终止递归 # 划分阶段 mid = (left + right) // 2 # 计算中点 self._merge_sort(left, mid, l2m) # 递归左子数组 self._merge_sort(mid + 1, right, l2m) # 递归右子数组 # 合并阶段 self._merge(left, mid, right, l2m) def _merge(self, left, mid, right, l2m): """ 合并左子数组和右子数组 """ # 左子数组区间 [left, mid] # 右子数组区间 [mid + 1, right] # 初始化辅助数组 tmp = list(self.coupon_list[left:right + 1]) # 左子数组的起始索引和结束索引 left_start = 0 left_end = mid - left # 右子数组的起始索引和结束索引 right_start = mid + 1 - left right_end = right - left # i, j 分别指向左子数组、右子数组的首元素 i = left_start j = right_start # 通过覆盖原数组 nums 来合并左子数组和右子数组 for k in range(left, right + 1): if l2m: i, j = self._little2max(i, j, k, left_end, right_end, tmp) else: i, j = self._max2little(i, j, k, left_end, right_end, tmp) def _little2max(self, i, j, k, left_end, right_end, tmp): # 若“左子数组已全部合并完”,则选取右子数组元素,并且 j++ if i > left_end: self.coupon_list[k] = tmp[j] j += 1 # 否则,若“右子数组已全部合并完”或“左子数组元素 <= 右子数组元素”,则选取左子数组元素,并且 i++ elif j > right_end or tmp[i][0] <= tmp[j][0]: self.coupon_list[k] = tmp[i] i += 1 # 否则,若“左右子数组都未全部合并完”且“左子数组元素 > 右子数组元素”,则选取右子数组元素,并且 j++ else: self.coupon_list[k] = tmp[j] j += 1 return i, j def _max2little(self, i, j, k, left_end, right_end, tmp): # 若“左子数组已全部合并完”,则选取右子数组元素,并且 j++ if i > left_end: self.coupon_list[k] = tmp[j] j += 1 # 否则,若“右子数组已全部合并完”或“左子数组元素 <= 右子数组元素”,则选取左子数组元素,并且 i++ elif j > right_end or tmp[i][1] >= tmp[j][1]: self.coupon_list[k] = tmp[i] i += 1 # 否则,若“左右子数组都未全部合并完”且“左子数组元素 > 右子数组元素”,则选取右子数组元素,并且 j++ else: self.coupon_list[k] = tmp[j] j += 1 return i, jdef _coupon_bags(coupon, amount): """ 优惠券背包算法 param: coupon 优惠券数组 param: amount 金额 """ # 转换金额跨度(间隔): 元->角 span = 10 amount = int(amount*span) for i, v in enumerate(coupon): for j in range(len(v)): coupon[i][j] = int(coupon[i][j]*span) # 初始化结果数组,dps 存储满减值(背包算法结果) # dps_coupons 存储 dps 对应满减值下使用的 优惠券方案 dps = [] dps_coupons = [] # len(coupon)+1,这里为什么要加 1, # 记住 动态算法规划算法背包问题一文中的: dp[i][0] = dq[0][j]=0;原因就是这个 for i in range(len(coupon)+1): # 这里为啥是 amount+1,因为 dps 中的索引是从0开始的, # 索引0的位置处存的是金额0的满减值,所以这里需要 amount+1 dps.append(list((0,)*(amount+1))) # list 直接 * 生成的是同一list,用循环生成 dps_coupons.append([]) for j in range(amount+1): dps_coupons[i].append([]) for i in range(1, len(coupon)+1): # i 代表第 i 张优惠券,从 1 开始的 for j in range(1, amount+1): # j 代表的是 总金额M为:j # coupon[i-1][0] 代表的是优惠券的中的 V,即满 coupon[i-1][0] 减 coupon[i-1][1] if j < coupon[i-1][0]: # 金额j 达不到 满减的条件:V,取上一层对应位置的值 # 获取上个策略值 dps[i][j] = dps[i-1][j] dps_coupons[i][j] = dps_coupons[i-1][j] else: # 金额j 达到了 满减的条件:V # dps中的i代表的是第几张优惠券,j代表的是总金额为J时的最优满减值 # coupon[i - 1][1],代表的是:当前优惠券的减免值 # dps[i - 1][j - coupon[i - 1][1]],代表的是剩余金额对应的最优满减值 if dps[i - 1][j] > coupon[i - 1][1] + dps[i - 1][j - coupon[i - 1][1]]: # 上一行同列数据 优于 当前优惠券+剩余的金额对应的上次数据,取之前数据 dps[i][j] = dps[i-1][j] dps_coupons[i][j] = dps_coupons[i-1][j] else: # 选取当前+剩余 优于 上一行数据 dps[i][j] = dps[i-1][j-coupon[i-1][1]]+coupon[i-1][1] # dps_coupons[i-1][j-coupon[i-1][1]],值是list,需要拷贝,才不会影响之前的结果 dps_coupons[i][j] = dps_coupons[i-1][j-coupon[i-1][1]].copy() # 表示使用了第 i 张优惠券 dps_coupons[i][j].insert(0, list(coupon[i-1])) # 结果需返回数据原单位(元) result_coupons = dps_coupons[-1][-1].copy() for i, v in enumerate(result_coupons): for j in range(len(v)): result_coupons[i][j] = result_coupons[i][j]/span print(f"使用优惠券:{result_coupons} 总减免:{dps[-1][-1]/span}") return result_coupons, dps[-1][-1]/spandef find_max_discount(coupon_list, amount): # 这里应该对 coupon_list 中的元素有要求,即 coupon_list[i][0] >= coupon_list[i][1] # 否则在计算 最优使用方案时会报错,即:dps[i - 1][j - coupon[i - 1][1]], # 要求:j - coupon[i - 1][1] >= 0 cs = CouponSort(coupon_list) sort_coupon = cs.sort() print(sort_coupon) return _coupon_bags(sort_coupon, amount)t = [[10, 1, 12], [20, 10, 43], [20, 15, 12], [24, 14, 1], [5, 4, 4], [66, 40, 15]]find_max_discount(t, 100)
4.4 可优化的点
1、使用一维数组存储结果值。
2、dps 间隔优化(如果优惠券有分,span为100,那数组就很大了)。
对于上面的优化点有机会再去思考
以上就是关于停车场优惠券可叠加使用的解决方案,特此记录下,文中有错误的地方,恳请指出,谢谢。特别感谢下面两位大佬!!!
参考资料:
关于满减优惠券叠加的背包算法
归并排序
标签:
- 01、关于满减优惠券可叠加使用场景下的动态规划算法
- 中骏集团购回并注销2.065亿美元2023年到期7.25%票据 焦点精选
- 我国成功发射宏图一号01组卫星
- 3月30日晚间利好消息一览(名单)
- 萌翻了!喜看神州大地小动物“闹”春图
- 防患于未然,南京消防开展森林火灾扑救联合实战演练
- 西安一男子坠楼砸中楼下6岁男童,双方不幸身亡 每日热门
- 每日视点!3月30日16时福建龙岩最新疫情防控信息 3月30日16时福建龙岩今天出多少阳性
- 国元证券:给予广联达买入评级,目标价位89.91元
- 停经36天hcg值多少正常_排卵期体温变化图
- 绽放“科研之花” 结出“产业之果”——山东科技大学科研团队获山东省科技进步奖一等奖侧记
- 为求前女友原谅,小伙在街头长跪不起,居民:几乎跪了一夜|观热点
- 视讯!渤海油田2022年新增油气探明储量创历史新高
- 让孩子好好说话,我们该怎么做 全球今热点
- 天天报道:江西乐安:田畴沃野春耕忙
- 市值近60亿!港股迎来2023年首家上市餐饮公司|今热点
- 安置房是什么意思可以买吗-安置房是什么意思
- 全球速递!睡觉最好的方向是朝哪_睡觉最好的方向是朝哪?
- 2022人民网人工智能算法挑战赛颁奖仪式成功举办-全球今头条
- 合资轿车雪上加霜!上汽名爵最帅轿跑MG7上市:11.98万起
- 股票行情快报:世龙实业(002748)3月29日主力资金净卖出92.03万元
- 浏阳枨冲镇:清除“四乱” 扮靓河畔
- 3月29日18时青海西宁疫情新增确诊数及西宁现在总共有多少疫情
- 胡润百富报告:广东已成为中国高净值家庭最多地区 世界头条
- 环球快资讯丨【锐见】“民主峰会”?连徒有其表都算不上
- 当前动态:全国农业大学排名 具体院校一览
- “村BA”联赛用“土”味儿守住“村”
- 世界即时:事业单位行政职业能力测验浅谈数量关系中的比较构造法
- 黄山最新门票免费政策:4月每周三黄山市景区免门票 今日要闻
- 数字时代,田园不远|环球今日报
- 鲜美不是“吹”的,蒲公英是盘“硬菜”
- 河北滦州:红薯育苗忙
- 美媒:格陵兰岛进入全年夏令时时代-天天视讯
- 社保基金长情股出炉 最长持有超10年 51股获得新进增持|每日快报
- 今日最新!姚曼:我是蒋大为情人,他欠我90万,有欠条为证,蒋大为:都是她逼我的
- 华润医疗(01515.HK):3月28日南向资金减持49.05万股|世界快资讯
- 希捷移动硬盘打不开_怎么打开|世界微速讯
- 环球信息:威海市经开区崮山镇:“小种苗”托起乡村振兴大产业
- 环球实时:纽市盘前:代理机构敦促瑞信股东投票反对批准董事会行动与股权薪酬 3月28日现货黄金、白银、原油、外汇短线走势分析
- 带我走到遥远的以后是什么歌_带我走 的歌词
- 富途去年四季度非标净利润增环比增26% 靠佣金率和利率提升_短讯
- LG gram Style 2023 OLED笔记本在中国上市 售价9999元
- 荷兰一男子疯狂捐精成550个孩子的爸爸:已被拉黑、正遭起诉
- 浙商证券:特斯拉Cybertruck皮卡将采用30X冷轧不锈钢 关注国内龙头甬金股份_环球新动态
- 山东省土地发展集团拟发行10亿元中期票据 期限3+2年_世界简讯
- 支付宝被曝启动7年来最大高管轮岗 知情人士回应
- 一名警卫班班长的来信引发的思考——依法管理岂能因人而异
- 继续领跑!河南三项入选2022年度全国十大考古新发现
- 铅笔英语怎么读_铅笔英语读音
- 长江十年禁渔“三年强基础”现场推进会召开 当前热闻
- 湖南黄金:2022年净利同比增20.38% 拟10派1元
- 环球焦点!负离子的功效与作用(快来了解一下吧)
- 【世界聚看点】bootymusic原唱在线听_booty music歌词英文
- 国元证券:2022年净利同比下降9.24% 拟10派1.5元
- 西安韦斗路常年坑洼不平 高新区细柳街道:今年暑期计划大修-今日热门
- 两家“煤老板”豪气分红!股价却冰火两重天 兖矿能源(01171)飙涨10% 中国神华(01088)跌超5%-世界热头条
- 微信聊天记录突出标记怎么做(微信聊天记录突然全部都没了如何找回)
- 整治扬尘在行动 助力打赢蓝天碧水净土保卫战 环球时快讯
- 新型储能步入规模化发展阶段
- 阿里国际站物流新能源专线增至29条
- 奇瑞新能源跟进汽车价格战 部分车型最高降价9000元
- “硕克杯”2023年海南省青少年足球比赛(U10和U11组)落幕|速递
- “内蒙古印象”,与你相约!-焦点信息
- 世界快看:全球财经连线|专访惠誉全球主权评级主管麦克名:中国强劲复苏将令其他经济体受益
- 劳动法病假待遇期间可以休假吗? 天天热议
- 金岂是池中物txt下载_金鳞岂是池中物 txt下载-今日讯
- 郴州三甲医院入职体检多少钱一次_入职体检多少钱一次
- 环球信息:四川省2022年度国家统一法律职业资格考试顺利收官
- 天天快讯:基坑土方开挖放坡规范(基坑放坡土方计算公式)
- 春节传统食物有哪些
- 视点!Linux服务器饥荒联机版开服教程
- 助力仁怀酱酒“起飞”,打通“黔货出山”快速通道,顺丰航空全货机首飞茅台机场_独家焦点
- 全国文物行业职业技能大赛开赛
- 全球观热点:深圳溪谷生态园的景点介绍
- 青岛今天晴间多云,市区最高气温10℃,最低气温6℃_世界新要闻
- 世界观热点:法国2-1逆转西班牙 夺欧国联冠军 附赛况详情
- 【全球速看料】外形更激进 凯迪拉克LYRIQ-V谍照曝光 功率超600马力?
- 宝鸡东岭集团下属单位_宝鸡东岭集团-焦点热门
- 救市什么意思-全球即时
- 天天热文:微信群的公告经典大全_微信群公告怎么写吸引人
- 拜仁欧冠富贵险中求!图赫尔独闯龙潭进决赛,谋事在人成事在天!
- 当前热点-保利发展完成与碧桂园合作9家项目公司股权转让,碧桂园为接盘方
- 酷睿三代处理器型号
- 信息量很大!“宁王”董事长回应市场关切 电池应用仍有10倍空间?_全球观焦点
- 一个电话号码可以注册几个微信_一个手机号可以注册几个微信号|天天讯息
- 03月25日张家口最新进出管控出入政策规定措施及疫情防控政策最新消息通知通告
- 鸿儒硕学什么意思_吴涛鸿儒什么意思|环球报资讯
- 光纤宽带有几种接入方式
- 重大项目“跑起来” 经济发展“热起来” 当前报道
- 广东省初中中考考哪些科目?各科满分是多少?
- 第三届儒商大会开幕在即 山东打好稳投资“组合拳”_全球观速讯
- 全球最新:全球关注:2023中国奢华品报告发布 香港仍为亚洲奢侈品购物中心
- 美财长说准备采取更多行动确保银行存款安全|播资讯
- 青年派2大结局
- 天天通讯!买高铁票何以如此之难?
- 榆次区路西街道办事处
- 环球精选!女生地摊套玩具熊拆开发现摄像头:放了3个月,一直对着天花板
- 快讯:欧预赛提醒:直布罗陀过去2场赛事均能够零封对手
- 西周分封制的主要内容和作用_西周分封制的主要内容
- 天天关注:云南 7 岁女孩将 4 岁男孩投井:不要从一个极端走向另一个极端
广告
广告
- 长治襄垣县增收11517万元 提前15天实现首季“开门红”
- 黑龙江讷河新增1例确诊4例无症状 病例详情公布
- 浙江宁波余姚奉化宁海三地开展核酸检测 结果均为阴性
- 浙江湖州南浔三处棋牌室经营者被行拘
- 那年今日 | 一张漫画涨知识之12月13日
- 在宁波乘火车跨省出行须持48小时内核酸阴性证明
- 浙江温州一地发现核酸弱阳性?复采复检结果均为阴性
- 浙江三门发现一名密接者:二次核酸检测结果均为阴性
- 贱卖的发电机 新买的制茶机——安徽水电供区改革两周年回访见闻
- 浙江杭州新增1例新冠肺炎确诊病例 为集中隔离人员
- 2022年研考在即,学硕缩招,专硕时代真的来了?
- 探访杭州核酸检测点:排队高峰多在夜间 医院24小时运转
- 浙江发挥零售药店“哨点”作用 织就疫情防控监测网
- 哈尔滨市本轮疫情首批1名确诊患者出院
- 宁波镇海第三轮全员核酸检测574181人 结果均为阴性
- 陕西新增本土确诊病例1例、境外输入无症状感染者2例
- 齐齐哈尔讷河一地调整为中风险地区
- 浙江新增新冠肺炎确诊病例75例 其中本土74例
- 内蒙古新增本土确诊病例5例 均在呼伦贝尔满洲里市
- 黑龙江无新增确诊病例 新增本土核酸检测初筛阳性人员5例