:博客首页: 进击的波吉
:今日分享的文章:Acwing周赛 第41场 Java题解
:坚持刷Acwing周赛,分享前三题题解
:Boji 还在努力准备蓝桥杯 ,如有疑问、疏漏之处,请多多指点
☀️:自学成长的路上,感谢大家相伴!No hurry , No Pause !
⭐️ 距离蓝桥杯大约还有一个月时间,决定开刷 Acwing周赛,y总近几期的周赛难度也是对标蓝桥杯的,吸纳了别人优秀的题解,总结出来Java题解!
⭐️求最小的组合字符串 :第二个字符串可以只取第一个,取第一个字符串中比较小的且比第二个字符串首位小的字符!
题解
:
import java.util.* ;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in) ;
char[] a = sc.next().toCharArray() ;
char[] b = sc.next().toCharArray() ;
String str = String.valueOf( a[0]);
String str1 = String.valueOf(b[0]) ;
for (int i = 1; i< a.length; i++) {
if (a[i] < str.charAt(i-1)) str += String.valueOf(a[i]) ;
else if (a[i] < str1.charAt(0)) str += String.valueOf(a[i]) ;
else break ;
}
String s = str + str1 ;
System.out.println(s) ;
}
}
⭐️ 主要难点:
题解
import java.util.* ;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in) ;
int n = sc.nextInt() ;
int x0 = sc.nextInt() ;
int y0 = sc.nextInt() ;
Set<String> slopes = new HashSet() ;
while(n-- > 0) {
int a = sc.nextInt() ;
int b = sc.nextInt() ;
//计算 横纵坐标的差值
a -= x0 ;
b -= y0 ;
int c = gcd(a, b) ;
//set可以判重,因此只需要保存 斜率的最简比
slopes.add(a/c + "/" + b/c ) ;
}
System.out.println(slopes.size()) ;
}
//欧几里得公式 求最大公约数
public static int gcd(int a, int b) {
return b!=0 ? gcd(b, a%b): a ;
}
}
⭐️ 主要难点:
import java.io.* ;
import java.util.* ;
public class Main {
public static int N = (int)2e5+10 ;
public static int[] q = new int[N] ; //存储dfs中第i个点是哪个
public static int[] p = new int[N] ; //存储点i在 dfs中的下标
public static int[] sz = new int[N] ; //存储点i的根子树大小
public static int n, m ;
public static int top = 0 ; //存储当前存储的第几个数
public static ArrayList<Integer>g[] = new ArrayList[N] ; //存储邻接表
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] s = br.readLine().split(" ") ;
n = Integer.parseInt(s[0]) ;
m = Integer.parseInt(s[1]) ;
//创建邻接表
for (int i = 0; i < N ;i++) g[i] = new ArrayList<>() ;
String[] str = br.readLine().split(" ") ;
int idx = 0 ;
for (int i = 2; i<= n; i++) {
//存储父节点t的邻边, 构建邻接表
int t = Integer.parseInt(str[idx++]) ;
g[t].add(i);
}
dfs(1) ; //遍历树,初始化二叉树的 q[i] 和 p[i]值
while(m-- >0 ){
String[] s2 = br.readLine().split(" ") ;
int u = Integer.parseInt(s2[0]) ;
int k = Integer.parseInt(s2[1]) ;
// k 超过u子树的范围, 则返回-1
if (k > sz[u]) bw.write("-1\n") ;
else bw.write(q[ p[u] + k-1 ] + "\n" ) ; //在范围中,则去 根节点u的第k-1个数
}
bw.flush() ;
bw.close() ;
br.close() ;
}
public static void dfs(int u) {
sz[u] = 1 ; //一个点对应一个节点数
q[top] = u ;//dfs 第 top 个数 为 u ;
p[u] = top ;//dfs中 u 的下标为 top ;
top++ ; //top +1
//遍历子树,若邻接表为空,跳过; 若邻接表不为空, 遍历子树
for (var v : g[u]) {
dfs(v) ;
sz[u] += sz[v] ; //记录子树段的大小
}
}
}