【算法刷题日记之本手篇】组队竞赛与删除公共字符
⭐️组队竞赛⭐️
🔐题目详情
牛牛举办了一次编程比赛,参加比赛的有 3*n 个选手,每个选手都有一个水平值 a_i.现在要将这些选手进行组队,一共组成 n 个队伍,即每个队伍 3 人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。例如:一个队伍三个队员的水平值分别是 3,3,3.那么队伍的水平值是 3 一个队伍三个队员的水平值分别是 3,2,3.那么队伍的水平值是 3 一个队伍三个队员的水平值分别是 1,5,2.那么队伍的水平值是 2 为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。如样例所示:如果牛牛把 6 个队员划分到两个队伍如果方案为:team1:{1,2,5}, team2:{5,5,8}, 这时候水平值总和为 7.而如果方案为:team1:{2,5,8}, team2:{1,5,5}, 这时候水平值总和为 10.没有比总和为 10 更大的方案,所以输出 10.
输入描述:
输出描述:
示例:
输入
输出
链接:https://www.nowcoder.com/questionTerminal/6736cc3ffd1444a4a0057dee89be789b来源:牛客网
💡解题思路
本题为 ACM 模式解题模式,需要自己写输入输出的代码,也就是先得使用Scanner
类获取数据,再通过println
输出答案。
基本思路:排序+筛选
根据题目要求,我们需要对这些选手进行分组,每组 3 人,每组的平均水平值为每组 3 个人水平值居中的那一个水平值,要想使平均水平值总和最高,我们要使每个队伍的最低水平值和最高水平值都尽可能地低,也就是说,假设有n
组,排序前n
个元素作为每组的最低水平值,我们还需要使每组的最高水平值也是最低,所以从第n+1
个元素开始,每连续两个元素作为一组的中间水平值与最高水平值,这样就能保证所有组的最大值水平和最小,平均水平值之和最大。
第一步,我们对数组进行排序,就拿示例5 2 8 5 1 5
来说,输入了两个队伍的水平值,一共 6 个数据,排序后得到1 2 5 5 5 8
。
第二步,我们示例的数据是两组,因此排序后数组前两个元素为每组的最小水平值,然后第三个与第四个元素分别为其中一组的中间水平值与最大水平值,同理第五个与第六个元素为另外一组的中间水平值与最大水平值,因此两组的最大瓶颈水平值之和为5+5=10
。
小心,求和的时候要注意会不会溢出,这题是存在溢出可能性,因此求和要使用long
类型的变量接收。
🔑源代码
参考语言 Java:
⭐️删除公共字符⭐️
🔐题目详情
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
输入描述:
输出描述:
示例
输入
输出
链接:https://www.nowcoder.com/questionTerminal/f0db4c36573d459cae44ac90b90c6212来源:牛客网
💡解题思路
本题为 ACM 类型的编程题,需要自己输入输出。
基本思路:简单模拟题遍历第一个字符串,判断每个字符是否在第二个字符串存在,如果存在则删除,或者使用 StringBuilder 对象构造,此时应忽略在第二个字符串存在的字符。
🔑源代码
参考语言:Java
🌱总结
组队竞赛:排序+筛选根据题目要求,我们需要对这些选手进行分组,每组 3 人,每组的平均水平值为每组 3 个人水平值居中的那一个水平值,要想使平均水平值总和最高,我们要使每个队伍的最低水平值和最高水平值都尽可能地低,也就是说,假设有n
组,排序前n
个元素作为每组的最低水平值,我们还需要使每组的最高水平值也是最低,所以从第n+1
个元素开始,每连续两个元素作为一组的中间水平值与最高水平值,这样就能保证所有组的最大值水平和最小,平均水平值之和最大。删除公共字符:简单模拟题遍历第一个字符串,判断每个字符是否在第二个字符串存在,如果存在则删除,或者使用 StringBuilder 对象构造,此时应忽略在第二个字符串存在的字符。
版权声明: 本文为 InfoQ 作者【未见花闻】的原创文章。
原文链接:【http://xie.infoq.cn/article/085af48195ecea733c88fe219】。文章转载请联系作者。
评论