31.牛牛与切割机

有一个序列 a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an , 牛牛将对这个序列切割一刀(划分分成两个不相交的非空序列,一个序列为 a1,...,apa_1,...,a_pa1,...,ap,另一个序列为 ap+1,...,ana_{p+1},...,a_nap+1,...,an),牛牛切割的代价为两个序列元素和的乘积。牛牛想知道切割代价最小是多少。

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 256M,其他语言512M

输入描述:

在这里插入图片描述

输出描述:

输出一个整数表示切割代价最小是多少。

示例1

输入例子:

5
1 2 3 4 5

输出例子:

14

例子说明:

序列被划分为1 和 2 3 4 5,右边和为 14。

示例2

输入例子:

4
2 1 3 4

输出例子:

16

例子说明:

序列被划分为 2 和 1 3 4。

解决方法

读题后发现应该使用前缀和来解决。

  1. 预处理:计算前缀和与后缀和

    • 前缀和数组 LL[i] 表示数组前 i+1 个元素的和(即 nums[0] + nums[1] + ... + nums[i])。
    • 后缀和数组 RR[i] 表示数组从 i 到末尾的元素和(即 nums[i] + nums[i+1] + ... + nums[n-1])。

    通过预处理,可在 O(1) 时间内获取任意分割点的两部分元素和。

  2. 遍历所有分割点,计算最小乘积
    对于每个可能的分割点 i(将数组分为 [0, i][i+1, n-1]),两部分的和分别为 L[i]R[i+1],乘积为 L[i] * R[i+1]。遍历所有分割点,记录最小乘积即可。

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int[] nums = new int[n];for(int i = 0;i<n;i++){nums[i] = in.nextInt();}long[] L = new long[n];long[] R = new long[n];L[0] = nums[0];R[n-1]=nums[n-1];for(int i = 1;i<n;i++){L[i] = L[i-1]+nums[i];}for(int i = n-2;i>=0;i--){R[i] = R[i+1]+nums[i];}long res = Long.MAX_VALUE;for(int i = 0;i<n-1;i++){long curres = L[i]*R[i+1];res= Math.min(res,curres);}System.out.println(res);}
}

32.字符串排序

给定 nnn 个字符串,请你对这 nnn个字符串按照以下规则从小到大排序。

对于任意两个字符串 sssttt ,在排序后应当满足:

- 若 s是 t 的一个前缀,则 s 在排序后的下标小于等于 t的在排序后的下标。
- 若存在整数 i ,使得 s 的前 i−1 个字符和 t 的前 i−1 个字符相同,且s 和 t 的第 i个字符不同,则比较第 i个字符的大小关系(字符的大小关系顺序由输入数据给出)。若 s 的第i个字符小于等于 t的第 i个字符,则 s 在排序后的下标小于等于 t 的在排序后的下标。

容易发现,上述排序方法的排序结果是唯一的。

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 256M,其他语言512M

输入描述:

第一行输入一个字符串,包含 26 个互不相同的小写字母。记 rank(c) 表示字母c 是该字符串的第rank(c)个字符,则字母 a小于等于字母b当且仅当rank(a)≤rank(b)  。第二行输入一个整数(1≤n≤1000) ,表示待排序字符串的数量。接下来n行,每行一个仅包含小写字母的字符串si(|si|≤1000),表示一个待排序的字符串。

输出描述:

按照排序后字符串位置下标从小到大的顺序输出n 行,每行一个字符串,表示排序的结果。

示例1

输入例子:

abcdefghijklmnopqrstuvwxyz
3
aaa
aac
aaaa

输出例子:

aaa
aaaa
aac

示例2

输入例子:

zyxwvutsrqponmlkjihgfedcba
3
aaa
aac
aaaa

输出例子:

aac
aaa
aaaa

解决方法

  1. 建立优先级映射:用哈希表 mp 存储每个字符对应的优先级(索引值),索引越小优先级越高(例如 priorityStr"bac" 时,'b' 优先级为 0,'a' 为 1,'c' 为 2)。

  2. 自定义排序规则:通过Collections.sort

    结合比较器,按照以下逻辑排序字符串:

    • 逐字符比较两个字符串,找到第一个不同的字符,根据它们在哈希表中的优先级值决定顺序(优先级高的字符所在字符串排前面)。
    • 若较短字符串是较长字符串的前缀(如 "abc""abcd"),则较短字符串排前面。
import java.util.Scanner;
import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String priorityStr = sc.nextLine();int n = Integer.parseInt(sc.nextLine());Map<Character,Integer> mp = new HashMap<>();for(int i = 0;i<priorityStr.length();i++){mp.put(priorityStr.charAt(i),i);}List<String> strs = new ArrayList<>();for(int i = 0;i<n;i++){strs.add(sc.nextLine());}Collections.sort(strs,(a,b)->{int an = a.length();int bn = b.length();int minLen = Math.min(an,bn);for(int i = 0;i<minLen;i++){char cA = a.charAt(i);char cB = b.charAt(i);if(cA != cB){return mp.get(cA)-mp.get(cB);}}return a.length()-b.length();});for(String str: strs){System.out.println(str);}}
}

33.牛牛的糖果树

牛牛的朋友送了她一棵节点数为 nn的糖果树(1号点为根节点),树上的每个糖果都有一个颜色。

牛牛吃糖果有一个习惯,她每次都会吃掉一整个子树的糖果,她喜欢与众不同,所以每次吃之前她都会把出现次数最多的颜色的糖果扔掉(可能有多个出现次数最多的颜色,此时要全部扔掉),她可以选择任意一棵子树吃掉,但她只能吃一次,因此他想知道她一次能吃到的所有糖果的颜色的异或和最大是多少(如果吃到了多个颜色相同的糖果,也需要做多次异或),你能帮帮她吗?

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 256M,其他语言512M

输入描述:

第一行一个整数n(1≤n≤1000)。表示树的节点数量。
第二行个整数ai(1≤ai≤1000),表示节点i的颜色。
接下来n-1行,每行两个整数u,v,表示节点u和节点v之间有一条边。

输出描述:

输出仅有一行,一个整数表示她一次能吃到的糖果的颜色的异或和最大值。

示例1

输入例子:

4
1 2 3 4 
1 2 
2 3 
2 4

输出例子:

0

例子说明:

四个节点颜色各不相同。吃掉任意子树都会在吃之前把所有糖果扔掉,因此结果为0。

示例2

输入例子:

4
1 1 2 2 
1 2
2 3 
2 4

输出例子:

1

例子说明:

吃掉以节点3或节点4为根的子树都只有一个节点,结果都为0,以1为根节点时颜色为1和颜色为2的节点数量都为2,因此结果也为0。吃掉以2为根的子树时节点3和节点4颜色都为2被删除,结果为节点2的颜色1。

解决方法

  1. 树结构构建:将输入的无向边转换为有明确父子关系的树结构(通过 DFS 确定每个节点的子节点)。

  2. 子树遍历与统计

    :对每个节点为根的子树,通过 DFS 统计:

    • 子树中每种颜色的出现次数;
    • 子树所有颜色的总异或和。
  3. 计算有效异或和:对每个子树,找出出现次数最多的颜色,排除它们的异或贡献后,得到剩余颜色的异或和,记录最大值。

import java.util.Scanner;
import java.util.*;
import java.io.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {static List<List<Integer>> children ;static int[] colors;public static void main(String[] args) throws IOException{// 1. 读取颜色,各边构成无向图/邻接表BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine());colors = new int[n+1];StringTokenizer st = new StringTokenizer(br.readLine());for(int i = 1;i<=n;i++){colors[i] = Integer.parseInt(st.nextToken());}List<List<Integer>> adj = new ArrayList<>();for(int i = 0;i<=n;i++){adj.add(new ArrayList<>());}for(int i = 0;i<n-1;i++){st = new StringTokenizer(br.readLine());int u = Integer.parseInt(st.nextToken());int v = Integer.parseInt(st.nextToken());adj.get(u).add(v);adj.get(v).add(u);}// 2. 建树children = new ArrayList<>();for(int i = 0;i<=n;i++){children.add(new ArrayList<>());}boolean[] visited = new boolean[n+1];buildTree(1,-1,adj,visited);// 3. 遍历每个子节点,统计最大异或数int res = 0;for(int i = 1;i<=n;i++){int[] colorCount = new int[1001];int curXor = dfs(i,colorCount);// 计算要排除的颜色int maxCount = 0;for(int j = 1;j<=1000;j++){maxCount = Math.max(maxCount,colorCount[j]);}int exclueXor = 0;for(int c = 1;c<=1000;c++){if(colorCount[c]==maxCount){if(colorCount[c]%2==1){exclueXor^=c;}}}res = Math.max(res,curXor^exclueXor);}System.out.println(res);}static void buildTree(int node,int parent,List<List<Integer>> adj,boolean[] visited){visited[node] = true;for(int neighbor: adj.get(node)){if(!visited[neighbor]&&neighbor != parent){children.get(node).add(neighbor);buildTree(neighbor,node,adj,visited);}}}static int dfs(int i,int[] colorsCount){int color = colors[i];colorsCount[color]++;int curXor = color;for(int child:children.get(i)){curXor ^= dfs(child,colorsCount);}return curXor;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94082.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94082.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94082.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【整数转罗马数字】

思路计算数字的位数&#xff1a; 通过 while(x) 循环计算输入数字 num 的位数 n。提取各位数字&#xff1a; 将数字 num 的每一位分解并存储到 nums 数组中&#xff0c;顺序为从高位到低位。罗马数字映射&#xff1a; 使用固定数组 Roman 存储罗马数字符号&#xff1a;Roman {…

spring Scheduled注解详解

spirng Scheduled注解详解 用于标记需要安排执行的方法的注解。必须指定 cron、fixedDelay 或 fixedRate 中的恰好一个属性。 被标注的方法必须不接受任何参数。它通常会具有 void 类型的返回值&#xff1b;如果不是这样&#xff0c;那么在通过调度器调用该方法时&#xff0c;返…

新升级超值型系列32位单片机MM32G0005

灵动微推出的新型MM32G0005系列基于ArmCortex - M0内核&#xff0c;具备高可靠性、低功耗、高性价比等特性。Flash升级至64KB&#xff0c;SRAM为4KB&#xff0c;还有1KB Data Flash。Flash全温擦写次数超过10万次。采用24Pin封装&#xff0c;最多有22个IO。QFN20和TSSOP20封装与…

Spark SQL 的详细介绍

Spark SQL 是 Apache Spark 生态系统中用于处理结构化数据的模块&#xff0c;它将 SQL 查询与 Spark 的分布式计算能力相结合&#xff0c;提供了一种高效、灵活的方式来处理结构化和半结构化数据。以下是对 Spark SQL 的详细介绍&#xff1a;1. 核心定位与优势结构化数据处理&a…

【FreeRTOS】空闲任务与钩子函数原理、实现与功能详解

一、FreeRTOS空闲任务概述FreeRTOS中的空闲任务(Idle Task)是系统自动创建的一个特殊任务&#xff0c;具有最低优先级(优先级0)。当没有其他更高优先级的任务运行时&#xff0c;调度器就会运行空闲任务。空闲任务的主要功能系统资源回收&#xff1a;自动清理被删除任务的内存和…

imx6ull-驱动开发篇6——Linux 设备树语法

目录 前言 设备树 设备树概念 DTS、 DTB 和 DTC DTS 语法 .dtsi 头文件 设备节点 /根节点​​ 节点命名与标签 节点层次结构​ 属性数据类型​ 标准属性 compatible 属性 model 属性 status 属性 #address-cells 和#size-cells 属性 reg 属性 ranges 属性 n…

ansible简单playbook剧本例子2

1. 准备主机组[rootansible-master ansible_quickstart]# vim inventory/hosts[web:vars] ansible_port22 ansible_passwordAdmin123456[web] 192.168.100.1822.准备剧本 vim hello.yml--- - hosts: webremote_user: roottasks:- name: Ping the target hostsping:- name: 获取…

EmpService 和 EmpMapper接口的作用

在这个项目中&#xff0c;EmpService 和 EmpMapper 都定义接口&#xff0c;是基于面向接口编程&#xff08;Interface Oriented Programming&#xff0c;IOP&#xff09;的设计思想&#xff0c;这两种接口在项目中承担着不同的职责&#xff0c;具体说明如下&#xff1a; EmpSer…

【语音技术】什么是动态实体

目录 动态实体的定义和维度 1.1 动态实体的资源 1.2 生效维度 1.2.1 应用级 1.2.2 用户级 1.2.3 自定义级 2. 动态实体的上传及使用 2.1 WebAPI 2.1.1 授权认证 2.1.2 上传资源接口 2.1.2.1 参数说明 2.1.2.2 返回说明 2.1.3 查询打包状态 2.1.3.1 参数说明 2.1.…

STM32学习记录--Day3

今天了解了下I2C&#xff1a;1.I2C电路结构I2C通信示意图&#xff1a;数据传输阶段​​​​主→从模式​​&#xff08;写操作&#xff09;&#xff1a;主机控制SCL时钟&#xff08;把SCL拉低&#xff09;主机向SDA线发送数据&#xff08;每次8位1位ACK&#xff09;​​主←从模…

裂变数据看板:5个核心指标决定活动生死​

数据是裂变活动的“指南针”。本文详解曝光量、转化率、裂变系数等5大核心指标&#xff0c;结合工具与案例&#xff0c;教你用数据驱动活动优化&#xff0c;避免“自嗨式裂变”。​为什么数据是裂变的“生死线”&#xff1f;&#xff08;认知重构&#xff09; 很多企业裂变活动…

iOS 类存储 与 C# 类存储 的差异

C# 中类的代码&#xff08;包括方法、属性等成员&#xff09;的存储机制与 Objective-C 有显著差异&#xff0c;其核心依赖于 ​CLR&#xff08;公共语言运行时&#xff09;的方法表&#xff08;Method Table&#xff09;和虚拟方法表&#xff08;vtable&#xff09;机制&#…

Selenium自动化:轻松实现网页操控

selenium自动化 1 什么是 Selenium 自动化 Selenium 是一个用于 Web 应用程序测试的工具&#xff0c;支持多种浏览器&#xff08;如 Chrome、Firefox、Edge 等&#xff09;。WebDriver 是 Selenium 的核心组件&#xff0c;用于控制浏览器行为并执行自动化操作。元素定位是通过…

又开发了一个优雅的小工具!

在开源项目中&#xff0c;Issues是一个强大的功能&#xff0c;用于跟踪bug、功能请求和任务。然而&#xff0c;随着项目的发展&#xff0c;Issues可能会变得难以管理&#xff0c;特别是当你需要离线访问或进行深入分析时。 当然GitHub Issues除了上述功能以外&#xff0c;做在线…

【安装教程】Docker Desktop 安装与使用教程

文章目录一、环境要求二、安装步骤2.1 安装 WSL 2&#xff08;适用于非专业版 Windows 10 及 Windows 11&#xff09;2.2 安装 Docker Desktop2.3 汉化 DDocker Desktop2.4 卸载 Docker Desktop三、使用 Docker3.1验证安装3.2. 拉取镜像3.3. 运行容器3.4. 查看容器3.5.更改容器…

Hutool 的 WordTree(敏感词检测)

package cn.hutool.dfa;WordTree 继承自 HashMap<Character, WordTree>&#xff0c;表示一个字符到子树的映射&#xff0c;构成一颗“词树”&#xff08;类似 Trie 树&#xff09;&#xff0c;用于快速匹配字符串中的词语&#xff08;敏感词检测、关键词匹配等&#xff0…

Makefile 从入门到精通:自动化构建的艺术

引入 在软件开发的世界里&#xff0c;“编译” 是绕不开的环节&#xff0c;但手动编译大型项目时&#xff0c;重复输入编译命令的痛苦&#xff0c;相信每个开发者都深有体会。Makefile 作为自动化构建的基石&#xff0c;能让编译过程“一键完成”&#xff0c;甚至智能判断文件变…

利用DeepSeek将Rust程序的缓冲输出改写为C语言实现提高输出效率

在前面多语言测试中&#xff0c;遇到一个难以置信的问题&#xff0c;rust的输出到文件比c语言还快&#xff0c;这是不合情理的&#xff0c;通过对两者输出语句的比较&#xff0c;发现了不同。 rust程序在输出到stdout前有这么一句 let mut writer BufWriter::with_capacity(6…

Java Optional 类教程详解

一、Optional 类核心定位Optional 是 Java 8 引入的函数式容器类&#xff08;java.util.Optional&#xff09;&#xff0c;专为​​显式空值处理​​设计。其核心价值在于&#xff1a;消除 60% 以上的传统 null 检查代码通过类型系统强制空值声明&#xff0c;降低 NPE 风险支持…

Agent X MCP 把想法编译成现实

多模态GUI智能体协作型AI魔搭社区MCPMCP 硬件