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

目录
相关文章
|
缓存 算法 网络协议
java架构师学习路线(BAT必备)
废话不多说,直接上路线,分阶段进行的,从简单基础入手
1022 0
|
9月前
|
监控 负载均衡 中间件
中间件中的gRPC
【6月更文挑战第4天】
96 3
|
数据挖掘 Python
spss、R语言、Python数据分析系列(6):R语言adf单位根检验
spss、R语言、Python数据分析系列(6):R语言adf单位根检验
1032 0
|
安全 API
【瑞吉外卖】day08:短信发送、手机验证码登录(一)
【瑞吉外卖】day08:短信发送、手机验证码登录
493 0
【瑞吉外卖】day08:短信发送、手机验证码登录(一)
|
10月前
|
iOS开发
iOS之使用模拟器报错:resource fork, Finder information, or similar detritus not allowed完美解决方案
iOS之使用模拟器报错:resource fork, Finder information, or similar detritus not allowed完美解决方案
6653 0
|
网络协议 Java 网络性能优化
java网络编程(3)UDP协议编程(单播多播广播)
这一篇文章开始着重讲解UDP编程。这块的知识也算是非常重要的,而且现在的编程都离不开网络。花了一些时间整理了一下。
433 0
java网络编程(3)UDP协议编程(单播多播广播)
|
10月前
r2dbc分页条件查询
r2dbc分页条件查询
230 0
|
算法 安全 Java
java中的对称加密算法
对数据的加密算是一个老生常谈的话题了,加密的方式很多,java也为这些加密算法提供了支持。今天就来聊聊对称加密算法的java实现方式。本文对加密算法不了解也没关系,我会从0开始讲解,保证小白也能看懂。
1268 2
java中的对称加密算法
|
物联网 开发者 异构计算
facechain人物写真生成工业级开源
facechain人物写真应用自8月11日开源了第一版证件照生成后。目前在github(GitHub - modelscope/facechain: FaceChain is a deep-learning toolchain for generating your Digital-Twin.)上已有5.7K的star,论文链接:FaceChain: A Playground for Identity-Preserving Portrait Generation:https://arxiv.org/abs/2308.14256。
856 4