48天强训 & Day1 & JavaOj

简介: 48天强训 & Day1 & JavaOj

48天强训 & Day1 & JavaOj

1. 编程题1 - 组队竞赛

组队竞赛_牛客笔试题_牛客网 (nowcoder.com)

6ef45771bba443b9a679a6a017c746e0.png



1.1 读题

fe1801714eb64398b355f9d91e30dd12.png

1.2 算法思想基础

我们应该尽量的让每一个队伍的中间值都最大化~

我们应该尽量的让每一个队伍的最小值都足够小~

前33%的不应该都作为每个队伍的最大值~

接下来我将讲解每个位置应该如何选组员~

但是这里我要说一个前提

首先,我们需要把所有人进行一个排序~

分为前三分之一,中三分之一,后三分之一

后三分之一为整体水平排名靠后的~

1.2.1 后三分之一

我们要想让一个队伍的最小值足够小

那么我们可以让那么就选整体水平的后三分之一

事实也是如此~

证明:(反证法)

首先:

6382e2247af34b1792e2bf4e328451bf.png


其次:


e72281ca3416470e825dc2067f77387c.png

得出结论:


4836b25a5d3643eea9a0bd52d6651f8f.png

也就是说,为了让组队水平最大化,我们应该让每个队伍的最小值,要在整体的后三分之一里去选~

并且这么选都可以,因为最大值和中间值都会比最小值大,并且队伍的水平不受最小值影响~

1.2.2 前三分之二

我们确定了每个队伍的最小值后,紧接着就要确定一个一个的队伍了~

切记,并不能让前三分之一的人都作为每个队伍的最大值,这样非常影响总体水平~

原理跟刚才差不多,可以用反证法证明~


09298b647f644c27bde8938f684ab630.png

其实这样排是有可能做对的

但是,肯定是有漏洞的~

e58f8bee76a6403abb231d754fb25438.png


而正确的思想是,一个一个队伍的去确定,每次确定都让这个队伍水平最大化~


69002750eb3041d9ad880434de318748.png

对于第二个队伍

2658025fdb184f208a6ea2814454a4b7.png


以此类推~

dc88d8f3ca094bd984e7dadc3e68eef4.png

所以,最大水平组队方式就是这样的

水平总和最大值为:

假设有n个队伍

所有人从大到小排为 a3n

水平总和值为Sn

则Snmax = a2 + a4 + a6 + ······ + a2n

1.3 代码设计

n为队伍的个数

那么我们只需要知道前2n名

topK问题

用优先级队列 - 堆

前k大,用小根堆

每次去梢(poll),就是去掉最小值

这里就相当于去掉a2n、a2n-1 ······

按照上面的算法,我们可以从a2n + a2n-2 + ······ + a4 + a2

即从后往前加

当然也可以直接用各种排序方式去排序,然后按照下标依次相加~

public class Main {
    public static void main(String[] args) {
      Scanner scanner = new Scanner(System.in);
      while(scanner.hasNextInt()) {
          int number = scanner.nextInt();
          PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
          for (int i = 0; i < number * 3; i++) {
              int value = scanner.nextInt();
              if(i < 2 * number) {
                  priorityQueue.offer(value);
              }else {
                  if(value > priorityQueue.peek()) {
                      priorityQueue.poll();
                      priorityQueue.offer(value);
                  }
              }
          }
          long result = 0;
          for (int i = 0; i < number; i++) {
              result += priorityQueue.poll();
              priorityQueue.poll();
          }
            System.out.println(result);
        }
  }
}


解析:

019ea93410024c01a86ee5cdf55aeef3.png


1. 3. 测试

1b512fb2c4f944ca8df98ac1526042ee.png

相关文章
|
11月前
|
Java
【JAVA项目】实现完美计算器
我设计的计算器用到的一些知识储备
141 0
|
10月前
|
网络协议 前端开发 Java
Netty实战(二)第一个Netty程序
这只是一个简单的应用程序,但是**它可以伸缩到支持数千个并发连接**——每秒可以比普通的基于套接字的 Java 应用程序处理多得多的消息。
114 0
|
10月前
|
SQL 监控 前端开发
Springboot过滤器和拦截器详解及使用场景
过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
|
10月前
|
XML 设计模式 JSON
Spring MVC 深度解析与应用实践(2)
4.2 校验 Spring MVC 提供了基于 JSR 303 和 JSR 349 的校验功能。我们可以在 Model 对象的属性上使用 JSR 303 和 JSR 349 提供的注解,如 @NotNull、@Size、@Pattern 等,来定义校验规则。然后,在 Controller 方法中使用 @Valid 注解来触发校验:
107 0
|
11月前
|
算法 Java 程序员
肝完阿里最新Java并发编程全优笔记,我成功晋升公司架构组
现在Java面试,问的是越来越底层。基本上规模大点的互联网公司都会对JVM,OS,算法,线程,IO等底层知识进行深入考察;其中粉丝反馈近期出去面试被问的最多,频次最高的技术栈当属多线程并发编程了。
|
11月前
|
机器学习/深度学习 SpringCloudAlibaba 安全
硬核!阿里2023版Spring全家桶进阶笔记流出,堪称Java跳槽神器
现在就这光景,不比以前,会个CRUD就有人要,即使大部分公司依然只需要做CRUD的事情......现在去面试,只会CRUD还要被吐槽:
|
11月前
|
设计模式 监控 前端开发
【Spring MVC学习笔记 七】深入理解SpringMVC拦截器原理
【Spring MVC学习笔记 七】深入理解SpringMVC拦截器原理
183 0
|
11月前
|
存储 缓存 算法
【Java并发编程 零】Java并发编程看这一篇就够了(一)
【Java并发编程 零】Java并发编程看这一篇就够了(一)
91 1
|
11月前
|
消息中间件 算法 Java
阿里大牛亲码1222道Java岗面试真题!(2023全彩版)
金三银四跳槽季,相信很多铁汁这个时候或多或少都有在准备面试的。对于刚入行的或者应届生一般面试前都会刷题或者看面经,这样心里才会有底。但也有人说面试前刷题是很愚蠢的行为,浪费时间效果还不大。但LZ认为,存在即真理!也许在有些人面前,刷题看面经真的没什么用,但谁又不是从刷题刷面经过来的呢,面试前系统的刷题梳理一下知识点还是对面试很有帮助的!
|
11月前
|
存储 网络协议 Java
【JavaEE】数据链路层-以太网协议-DNS
JavaEE & 网络原理补充-数据链路层 & 以太网协议 数据链路层更接触底层,也就离我们更远了,所以只需要了解即可,在本文章也不会涉及太深! 1. 以太网数据帧 以太网数据帧就是对IP数据报进一步的包装的数据报 以太网协议,属于数据链路层也属于物理层 数据链路层和物理层之间还是有很多联系的,有很多重合
189 2