【C++】问题 I: 许攸说

编程题解:曹操夜袭乌巢的策略分析
文章提供了一个关于编程的问题,涉及数组操作和算法设计。许攸帮助曹操制定战略,通过给骑兵团分配任务来夜袭乌巢。给定每个骑兵团的耐力值,目标是找到让两边骑兵团数量相等的策略。文章中给出了两个不同的C++代码实现,第一个使用了两个额外的数组,第二个简化版直接通过排序后的原数组计算。优化后的代码通过了所有测试用例。

许攸总是说:“吾有良略在怀,必为阿瞒所需

阿瞒有我良计,取冀州便是易如反掌

吾才满腹,袁本初竟不从之

阿瞒有我良计,取冀州便是易如反掌

吾才满腹,袁本初竟不从之

阿瞒有我良计,取冀州便是易如反掌

吾才满腹,袁本初竟不从之

成略在胸,良计速出

吾才满腹,袁本初竟不从之

阿瞒有我良计,取冀州便是易如反掌

吾才满腹,袁本初竟不从之

阿瞒有我良计,取冀州便是易如反掌

吾才满腹,袁本初竟不从之

阿瞒有我良计,取冀州便是易如反掌

吾有良略在怀,必为阿瞒所需

阿瞒有我良计,取冀州便是易如反掌

吾才满腹,袁本初竟不从之

阿瞒有我良计,取冀州便是易如反掌

吾才满腹,袁本初竟不从之

阿瞒有我良计,取冀州便是易如反掌

吾才满腹,袁本初竟不从之

成略在胸,良计速出

吾才满腹,袁本初竟不从之

阿瞒有我良计,取冀州便是易如反掌

吾才满腹,袁本初竟不从之

阿瞒有我良计,取冀州便是易如反掌

吾才满腹,袁本初竟不从之

阿瞒有我良计,取冀州便是易如反掌

阿瞒,没有我,你得不到冀州啊!!!”

现在我们知道了,许攸就是个废话大王。

不过现在让我们来看看他是怎么帮曹操夜袭乌巢的。曹操有n个骑兵团,每一个骑兵团的耐力为d,许攸对曹操说,需要找到一个值k,耐力小于k的去乌巢东边偷袭,耐力值大于等于k的去西边偷袭,聪明的你知道有多少种取值k能让去偷袭东边的骑兵团数量和去偷袭西边的骑兵团数量相等吗?

2<=n<=1e5

1<=di<=1e5

输入全为整数

输入

n

d1 d2 d3.. dn

输出

多少种选择

样例输入
6
9 1 4 4 6 7
样例输出
2

一个错误答案和蹩脚算法如上;

处理本题我首先想出了一个粗略的框架。采用的是从小到大排序再对半分的思路,奇数n直接输出0,偶数再分了两个数组取东边组最末尾元素和西边组第一个元素的思路。

但是就算这样能过几个测试用例,输出还是错的。

而且有必要分东西两个数组吗?根本没必要!直接在数组里找d[n/2]和d[n/2-1]相减就可以了。

简化和优化如下,能够通过:

IPO描述: 输入:《三国演义》文本文件 处理:统计每个典型人物名字在文本中出现的次数 输出:每个典型人物名字在文本中出现的次数,按照出现次数从高到低排序 算法部分: 1. 读取《三国演义》文本文件,将其转化为字符串。 2. 定义一个字典,用于存储每个典型人物名字在文本中出现的次数。 3. 遍历文本字符串,对于每个典型人物名字,使用正则表达式匹配其出现的次数,并将其存储到字典中。 4. 对字典按照值进行排序,得到每个典型人物名字在文本中出现的次数,按照出现次数从高到低排序。 5. 输出排序后的结果。 代码实现: import re def count_characters(filename): with open(filename, 'r', encoding='utf-8') as f: text = f.read() characters = ['曹操', '刘备', '孙权', '诸葛亮', '周瑜', '关羽', '张飞', '赵云', '马超', '黄忠', '魏延', '姜维', '庞统', '徐庶', '司马懿', '张辽', '许褚', '夏侯惇', '夏侯渊', '张郃', '于禁', '甄姬', '貂蝉', '黄月英', '孟获', '祝融', '大乔', '小乔', '甘宁', '吕布', '华佗', '袁绍', '袁术', '董卓', '吕蒙', '陆逊', '周泰', '凌统', '丁奉', '孙策', '孙坚', '鲁肃', '华雄', '公孙瓒', '颜良', '文丑', '张角', '于吉', '蔡文姬', '荀彧', '程昱', '郭嘉', '贾诩', '荀攸', '徐晃', '典韦', '许攸', '高顺', '张任', '张昭', '张纮', '吕葆中', '吕虔', '吕翔', '陈宫', '田丰', '沮授', '逢纪', '刘表', '刘璋', '刘备妻妾', '孙尚香', '甘夫人', '黄月英', '王异', '糜夫人', '孙夫人', '大乔', '小乔', '步练师', '貂蝉', '王允', '董卓部下', '华雄部下', '董卓女儿', '吕布部下', '袁绍部下', '袁术部下', '曹操部下', '刘备部下', '孙权部下', '蜀汉臣子', '魏国臣子', '吴国臣子', '群雄', '其他'] character_count = {} for character in characters: pattern = re.compile(character) count = len(pattern.findall(text)) character_count[character] = count sorted_count = sorted(character_count.items(), key=lambda x: x[1], reverse=True) for item in sorted_count: print(item[0], item[1]) count_characters('sanguoyanyi.txt')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

城主_全栈开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值