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

目录
相关文章
|
SQL 关系型数据库 MySQL
SyncNavigator数据库同步软件8.4.1 中文版
SyncNavigator是一款专门用于SqlServer、Mysql数据同步的软件,由国内顶级开发团队开发完成,经历8年逐步完善,目前具备强大的数据同步功能,国内很多大型连锁超市,企业,公司都在用SyncNavigator数据同步软件进行着数据同步服务。
5569 0
|
Shell Linux 数据安全/隐私保护
【Shell 命令集合 系统管理 】Linux 修改用户默认shell的命令 chsh命令 使用指南
【Shell 命令集合 系统管理 】Linux 修改用户默认shell的命令 chsh命令 使用指南
463 0
|
前端开发 NoSQL Java
SpringBoot从入门到精通(二十)快速构建Restful Web API 服务
随着互联网化等逐渐深入,应用系统也变得越来越复杂,系统架构正在朝着微服务化,中台化的方向发展。这就需要各个系统、各个厂家之间的数据频繁交互。所以,使用 Restful 风格构建的应用接口适用于移动互联网厂商的业务场景,正在被越来越多的企业推荐使用。那么什么是 RESTful 呢?
SpringBoot从入门到精通(二十)快速构建Restful Web API 服务
|
8月前
|
存储 人工智能 自然语言处理
AI智能体从请求到响应,这系统过程中究竟藏着什么?
三桥君带你深入解析AI智能体从用户请求到生成响应的全流程,涵盖接入服务、智能体应用、知识检索、模型重排、LLM调用与工具执行等关键技术环节,揭开AI背后的运作原理。
458 2
|
8月前
|
云安全 人工智能 负载均衡
如何制作访客管理二维码
本文介绍如何利用草料二维码制作访客登记二维码,提升企业、学校、医院等场所的访客管理效率。内容涵盖二维码制作步骤、设置登记与预约限制、部署方式及数据统计分析,帮助用户实现高效、安全的数字化访客管理。
|
8月前
|
JavaScript 安全 编译器
TypeScript 类型守卫:让你的类型系统更智能
TypeScript 类型守卫:让你的类型系统更智能
|
JavaScript 定位技术 API
Vue获取照片拍摄的地理位置信息
iPhone屏幕尺寸和开发适配
958 155
|
存储 人工智能 Serverless
妙用AI助理帮您定方案、找细节
当您希望在繁琐的文档中迷失方向时,AI助理能为您提供清晰指引,助您轻松实现加速配置与获取核心代码参数,显著简化开发流程。无论是方案获取还是寻找细节,只需向AI助理提问,即可获得详细步骤与示例代码,大幅提升工作效率。点击右下角的AI助理,即刻体验便捷服务。
520 1
|
数据可视化 数据挖掘 定位技术
基于geopandas的空间数据分析—geoplot篇(上)
基于geopandas的空间数据分析—geoplot篇(上)
407 9
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
761 0

热门文章

最新文章