当前位置: 首页 > news >正文

HJ喜欢切数组的红

两个解法:

解法1:提前预处理,用空间换时间

importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);if(!in.hasNextInt())return;intn=in.nextInt();long[]reds=newlong[n];// 元素可能很大,用 long 防止溢出longtotalSum=0;for(inti=0;i<n;i++){reds[i]=in.nextLong();totalSum+=reds[i];}// 1. 不能被3整除,绝对无法平分if(totalSum%3!=0){System.out.println(0);return;}longtarget=totalSum/3;// 2. 预处理 nextPos 数组:nextPos[i] 表示从索引 i 开始,右侧第一个正数的位置int[]nextPos=newint[n];intlastPositiveIndex=n;// 用 n 代表无穷大(没找到)for(inti=n-1;i>=0;i--){if(reds[i]>0){lastPositiveIndex=i;}nextPos[i]=lastPositiveIndex;}// 3. 预处理 suffixCount 数组:统计合法的第三段数量// suffixCount[j] 表示以 j 作为第三段的起点,有多少种合法方案int[]suffixCount=newint[n+1];longcurrentSuffixSum=0;booleansuffixHasPos=false;// 从右向左遍历,j 最小到 2(给第一段和第二段各留至少1个位置)for(intj=n-1;j>=2;j--){currentSuffixSum+=reds[j];if(reds[j]>0)suffixHasPos=true;// 继承后面的数量suffixCount[j]=suffixCount[j+1];// 如果当前后缀满足条件(和为 target 且有正数),数量 +1if(currentSuffixSum==target&&suffixHasPos){suffixCount[j]++;}}// 4. 从左向右寻找第一段,并累加答案longans=0;longcurrentPrefixSum=0;booleanprefixHasPos=false;// 第一段终点 i 最大到 n-3for(inti=0;i<=n-3;i++){currentPrefixSum+=reds[i];if(reds[i]>0)prefixHasPos=true;// 如果找到合法的第一段if(currentPrefixSum==target&&prefixHasPos){// 中间段从 i+1 开始,找它里面的第一个正数位置 pintp=nextPos[i+1];// 如果中间段能找到正数,且不是数组最后一个元素(要给第三段留位置)if(p<n-1){// 第三段的起点 j 必须在 p 之后 (即 j >= p + 1)// 这样才能保证索引为 p 的那个正数,稳稳地落在了中间段里!ans+=suffixCount[p+1];}}}System.out.println(ans);}}

解法2:暴力验证法

importjava.util.*;classSolution{publicvoidredCutToTreeParts(int[]reds,intnum){if(reds==null||num<3){System.out.print(0);return;}longsum=0;for(intred:reds){sum+=red;}if(sum%3!=0){System.out.print(0);return;}longtarget=sum/3;// 前缀和与前缀正数计数long[]prefixSum=newlong[num+1];int[]prefixPositiveCount=newint[num+1];for(inti=0;i<num;i++){prefixSum[i+1]=prefixSum[i]+reds[i];prefixPositiveCount[i+1]=prefixPositiveCount[i]+(reds[i]>0?1:0);}// 获取包含正数的有效左切点ArrayList<int[]>leftCuts=newArrayList<>();// [index, positive_count_in_segment]for(inti=0;i<num-2;i++){if(prefixSum[i+1]==target){intposCount=prefixPositiveCount[i+1];if((target==0&&posCount>0)||(target!=0&&posCount>0)){leftCuts.add(newint[]{i,posCount});}}}// 获取包含正数的有效右切点ArrayList<int[]>rightCuts=newArrayList<>();// [index, positive_count_from_right]for(inti=num-1;i>1;i--){if(prefixSum[num]-prefixSum[i]==target){intposCount=prefixPositiveCount[num]-prefixPositiveCount[i];if((target==0&&posCount>0)||(target!=0&&posCount>0)){rightCuts.add(newint[]{i,posCount});}}}Collections.reverse(rightCuts);longcount=0;for(int[]leftData:leftCuts){intleftId=leftData[0];intleftPosCount=leftData[1];// 二分查找满足 rightId > leftId + 1 的起始位置intl_idx=0,r_idx=rightCuts.size();while(l_idx<r_idx){intmid=(l_idx+r_idx)/2;if(rightCuts.get(mid)[0]>leftId+1){r_idx=mid;}else{l_idx=mid+1;}}// 检查从 l_idx 开始的每个 rightId,验证中间段是否包含正数for(intk=l_idx;k<rightCuts.size();k++){intrightId=rightCuts.get(k)[0];// 中间段 [leftId + 1, rightId - 1] 的正数计数intmiddlePosCount=prefixPositiveCount[rightId]-prefixPositiveCount[leftId+1];if(middlePosCount>0){count++;}}}System.out.print(count);}}publicclassMain{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);intn=in.nextInt();int[]reds=newint[n];for(inti=0;i<n;i++){reds[i]=in.nextInt();}Solutionsolution=newSolution();solution.redCutToTreeParts(reds,n);in.close();}}
http://www.jsqmd.com/news/587680/

相关文章:

  • 效率翻倍:用快马打造专属阿里悟空AI绘画批量生成工具
  • 实战演练:基于快马平台与方锐理念构建短视频智能配乐应用
  • Qualcomm SA8775P深度解析 ——一颗芯片搞定座舱+智能驾驶?工程师告诉你真相
  • CSS如何实现响应式导航在小屏下的隐藏_利用-checked实现开关交互
  • 新手友好:用快马AI生成第一个Skill-Vetter式自测应用
  • REX-UniNLU实战:无需代码,用Web界面快速分析文本情感与实体关系
  • YimMenu:GTA V 增强与防护工具全攻略
  • Godot 4 2D 物理引擎位置初始化踩坑:add_child() 和 position 到底谁先? (错误位置触发物理事件)
  • seo关键词挖掘工具哪个好_seo数据分析工具哪个最强
  • STM32CubeIDE实战:手把手教你为stm32f767手动添加DSP库(附FPU配置技巧)
  • c语言完美演绎6-20
  • League-Toolkit:英雄联盟客户端全功能智能助手,颠覆传统游戏体验的本地化解决方案
  • 探索Azure REST API与Power BI的无缝集成
  • Golang怎么用sqlc从SQL生成类型安全代码_Golang如何根据SQL语句自动生成Go查询函数【教程】
  • AI双剑合璧:用Apifox设计AI优化接口,快马AI实现智能代码生成
  • C++ 子数组位运算结果 题型
  • 快马平台快速构建n8n工作流原型:十分钟搭建订单自动化处理demo
  • 基于下垂控制的光储直流微电网模型 1.模型由光伏和储能以及直流负载组成 2.光伏采用扰动观测法...
  • 效率提升:利用快马平台自动化生成yolov8结构图与参数分析报告
  • C语言完美演绎6-21
  • 终极自动化解决方案:开源跨平台修复Kindle电子书封面丢失问题
  • 利用快马平台快速构建nodepad原型:十分钟打造可运行文本编辑器
  • 如何快速搭建Galgame社区平台:一站式开源解决方案指南
  • 前端新手福音:在快马平台用anygold组件库完成你的第一个交互页面
  • 数字化转型架构下的数据安全治理指南:以数据安全为核心的安全立体防御体系、数据安全体系、数据安全现状评估报告···(附相关资料)
  • 网站SEO推广需要多少钱_如何选择合适的网站 SEO 推广服务商
  • 别再死磕定点数了!手把手教你用STM32的FPU榨干浮点运算性能(附Keil配置避坑指南)
  • 实战指南:从零到一,使用快马AI开发并部署9-1免费安装活动正式页面
  • seo外包需要提供哪些资料
  • .au域名注册后如何进行SEO优化