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

【蓝桥杯集训3】二分专题(3 / 5)

目录

二分模板

1460. 我在哪? - 二分答案 + 哈希表

1221. 四平方和 - 哈希表 / 二分

1、哈希表

2、二分 + 自定义排序

1227. 分巧克力 - 

113. 特殊排序 -  


二分模板

  • l + r >> 1 —— 先 r = mid 后 l = mid+1 —— 寻找左边界 —— 找大于某个数的最小值
  • l+r+1>>1 —— 先 l = mid 后 r = mid-1 —— 寻找右边界 —— 找小于某个数的最大值

活动 - AcWing 

import java.util.*;class Main
{public static void main(String[] args){Scanner sc=new Scanner(System.in);int n=sc.nextInt(),t=sc.nextInt();int[] a=new int[n];for(int i=0;i<n;i++) a[i]=sc.nextInt();while(t-->0){int x=sc.nextInt();int l=0,r=n-1;while(l<r){int mid=l+r>>1;if(a[mid]>=x) r=mid;else l=mid+1;}if(a[r]!=x) {System.out.println(-1+" "+-1);continue;}System.out.print(r+" ");l=0;r=n-1;while(l<r){int mid=l+r+1>>1;if(a[mid]<=x) l=mid;else r=mid-1;}System.out.println(r);}}
}

1460. 我在哪? - 二分答案 + 哈希表

1460. 我在哪? - AcWing题库

题目:

约翰想要知道最小的 K 的值,使得他查看任意连续 K 个邮箱序列,他都可以唯一确定这一序列在道路上的位置.
最小的K值,意思是要找到最小长度为K的子串并且只出现过一次

思路:

二分答案K值

用哈希表存前面出现过的子串,如果后面长度为k的子串在哈希表存在过,说明后面的子串在前面出现过,说明该k值小,答案应该增大

最后二分出满足要求的最小k值

import java.util.*;class Main
{static String s="";public static boolean ck(int len,String s){int n=s.length();Set<String> st=new HashSet<>();for(int i=0;i+len-1<n;i++){String t=s.substring(i,i+len);if(st.contains(t)) return false; //如果后面存在前面出现过的st.add(t);}return true;}public static void main(String[] args){Scanner sc=new Scanner(System.in);int n=sc.nextInt();String s=sc.next();int l=1,r=n;while(l<r){int mid=l+r>>1;if(ck(mid,s)) r=mid;else l=mid+1;}System.out.print(l);}
}

 

1221. 四平方和 - 哈希表 / 二分

活动 - AcWing

题目:

思路:

a,b,c,d的枚举范围为\sqrt{n},四重循环会tle

所以我们只能枚举两个数
因此我们需要用空间换时间
先将 c^{2}+d^{2} 存起来降低时间复杂度

1、哈希表

因为要按0≤a≤b≤c≤d顺序,存第一个表示法

所以对于cd组合,d从c开始枚举,将 sum=c^{2}+d^{2} 对应的c和d存起来

因为cd是从小到大枚举的,所以如果后面再次出现相同的sum值,就跳过,只存第一次的

对于ab组合,b从a开始枚举,a^{2}+b^{2}确定后,一定存在对应的sum=c^{2}+d^{2}

因为ab是从小到大枚举的,所以当出现对应的sum值时,直接输出,return

import java.util.*;class Main
{public static void main(String[] args){Scanner sc=new Scanner(System.in);int n=sc.nextInt();Map<Integer,int[]> mp=new HashMap<>();for(int c=0;c*c<=n;c++)for(int d=c;d*d+c*c<=n;d++){int t=d*d+c*c;if(!mp.containsKey(t)) mp.put(t,new int[] {c,d});}for(int a=0;a*a<=n;a++)for(int b=a;b*b+a*a<=n;b++){int x=n-a*a-b*b;int[] tp=mp.get(x);if(mp.containsKey(x)){System.out.print(a+" "+b+" "+tp[0]+" "+tp[1]);return;}}}
}

2、二分 + 自定义排序

对cd组合结果进行排序

在枚举ab组合时,二分满足条件的cd组合

import java.util.*;class Main
{public static void main(String[] args){Scanner sc=new Scanner(System.in);int n=sc.nextInt();List<int[]> list=new ArrayList<>();for(int c=0;c*c<=n;c++)for(int d=c;d*d+c*c<=n;d++){int t=d*d+c*c;list.add(new int[]{t,c,d});}list.sort(new Comparator<int[]>(){public int compare(int[] o1,int[] o2){if(o1[0]!=o2[0]) return o1[0]-o2[0]; //从大到小if(o1[1]!=o2[1]) return o1[1]-o2[1];return o1[2]-o2[2];}});    for(int a=0;a*a<=n;a++)for(int b=a;b*b+a*a<=n;b++){int x=n-a*a-b*b;int l=0,r=list.size()-1;while(l<r){int mid=l+r>>1;if(list.get(mid)[0]>=x) r=mid;else l=mid+1;}if(list.get(l)[0]==x){int c=list.get(l)[1];int d=list.get(l)[2];System.out.print(a+" "+b+" "+c+" "+d);return;}}}
}

1227. 分巧克力 - 

活动 - AcWing

题目:

思路:

 

113. 特殊排序 -  

活动 - AcWing

题目:

思路:

http://www.lryc.cn/news/7421.html

相关文章:

  • 在成都的哪个培训机构学习Java好呢?
  • 传输层重要协议之UDP协议和TCP协议详解
  • BNB Greenfield 成存储赛道“新贵”,BNB 生态的野心与破局
  • 【SQL开发实战技巧】系列(十六):时间类型操作(上):日、月、年、时、分、秒之差及时间间隔计算
  • JavaScript知识点总结
  • adb命令记录
  • 9.Docker Swarm
  • 基于tensorflow keras DNN神经网络训练预测豆瓣中文影评差评好评 附完整代码 +数据
  • 商城系统必备营销工具(五)——积分商城
  • SpringBoot08:Shiro
  • 进击中的 Zebec 生态,Web2 与 Web3 世界的连接器
  • SpringCloud保姆级搭建教程五---Redis
  • 存储类别、链接与内存管理(一)
  • JS设计模式
  • 四、常用样式讲解二
  • KDHX-8700无线高压核相相序表
  • 【C++提高笔记】泛型编程与STL技术
  • 实用机器学习-学习笔记
  • 2023-02-15 学习记录--React-邂逅Redux(二)
  • Framework——【MessageQueue】消息队列
  • SpringBoot依赖原理分析及配置文件
  • 智慧机场,或将成为航空领域数字孪生技术得完美应用
  • SQL64 对顾客ID和日期排序
  • MybatisPlus使用聚合函数
  • 工程管理系统源码企业工程管理系统简介
  • 《计算机视觉和图像处理简介 - 中英双语版》:使用 OpenCV对图像进行空间滤波
  • FreeRTOS软件定时器 | FreeRTOS十三
  • 电脑文件被误删?360文件恢复工具,免费的文件恢复软件
  • pg_cron优化案例--terminate pg_cron launcher可自动拉起
  • Python 之 NumPy 随机函数和常用函数