写点什么

【算法刷题日记之本手篇】组队竞赛与删除公共字符

作者:未见花闻
  • 2022 年 7 月 02 日
  • 本文字数:2106 字

    阅读完需:约 7 分钟

⭐️组队竞赛⭐️

🔐题目详情

牛牛举办了一次编程比赛,参加比赛的有 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.​


输入描述:


输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)第二行包括3*n个整数a_i(1 ≤ a_i ≤ 10^9),表示每个参赛选手的水平值.
复制代码


输出描述:


输出一个整数表示所有队伍的水平值总和最大值.
复制代码


示例:


输入


25 2 8 5 1 5
复制代码


输出


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:


import java.util.*;
public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] arr = new int[3 * n]; for (int i = 0; i < 3 * n; i++) { arr[i] = sc.nextInt(); } //1.排序 Arrays.sort(arr); //2.筛选 long ans = 0; for (int i = n; i < 3 * n; i += 2) { //后面两数前者为中间值,作为每组的平均水平值 ans += arr[i]; } System.out.println(ans); }}
复制代码

⭐️删除公共字符⭐️

🔐题目详情

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”


输入描述:


每个测试输入包含2个字符串
复制代码


输出描述:


输出删除后的字符串
复制代码


示例


输入


They are students. aeiou
复制代码


输出


Thy r stdnts.
复制代码


链接:https://www.nowcoder.com/questionTerminal/f0db4c36573d459cae44ac90b90c6212来源:牛客网

💡解题思路

本题为 ACM 类型的编程题,需要自己输入输出。


基本思路:简单模拟题遍历第一个字符串,判断每个字符是否在第二个字符串存在,如果存在则删除,或者使用 StringBuilder 对象构造,此时应忽略在第二个字符串存在的字符。


🔑源代码

参考语言:Java


import java.util.*;
public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str1 = sc.nextLine(); String str2 = sc.nextLine(); StringBuilder ans = new StringBuilder(); int n = str1.length(); for (int i = 0; i < n; i++) { String cur = str1.charAt(i) + ""; if (!str2.contains(cur)) { ans.append(cur); } } System.out.println(ans.toString()); }}
复制代码

🌱总结

组队竞赛:排序+筛选根据题目要求,我们需要对这些选手进行分组,每组 3 人,每组的平均水平值为每组 3 个人水平值居中的那一个水平值,要想使平均水平值总和最高,我们要使每个队伍的最低水平值和最高水平值都尽可能地低,也就是说,假设有n组,排序前n个元素作为每组的最低水平值,我们还需要使每组的最高水平值也是最低,所以从第n+1个元素开始,每连续两个元素作为一组的中间水平值与最高水平值,这样就能保证所有组的最大值水平和最小,平均水平值之和最大。删除公共字符:简单模拟题遍历第一个字符串,判断每个字符是否在第二个字符串存在,如果存在则删除,或者使用 StringBuilder 对象构造,此时应忽略在第二个字符串存在的字符。

发布于: 刚刚阅读数: 3
用户头像

未见花闻

关注

坚持+努力=诗+远方 2021.11.15 加入

一位热爱技术热爱分享的大学生!

评论

发布
暂无评论
【算法刷题日记之本手篇】组队竞赛与删除公共字符_7月月更_未见花闻_InfoQ写作社区