🏠:博客首页: 进击的波吉 📕:今日分享的文章: 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) ;
}
}
?? 主要难点:
- 斜率表示 ,精读的范围在测试中,就被卡了,因此建议 斜率的问题 用向量表示
- 数据保存,用set方法存储 slope,会默认判重
- 欧几里得公式,求最大公约数公式 (模板熟记)
题解
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) ;
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 ;
}
}
?? 主要难点:
- 邻接表的创建, 用ArrayList
- 坐标的转换与理解,DFS中对应第i个点 以及它的下标
- dfs遍历二叉树的理解
import java.io.* ;
import java.util.* ;
public class Main {
public static int N = (int)2e5+10 ;
public static int[] q = new int[N] ;
public static int[] p = new int[N] ;
public static int[] sz = new int[N] ;
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++) {
int t = Integer.parseInt(str[idx++]) ;
g[t].add(i);
}
dfs(1) ;
while(m-- >0 ){
String[] s2 = br.readLine().split(" ") ;
int u = Integer.parseInt(s2[0]) ;
int k = Integer.parseInt(s2[1]) ;
if (k > sz[u]) bw.write("-1\n") ;
else bw.write(q[ p[u] + k-1 ] + "\n" ) ;
}
bw.flush() ;
bw.close() ;
br.close() ;
}
public static void dfs(int u) {
sz[u] = 1 ;
q[top] = u ;
p[u] = top ;
top++ ;
for (var v : g[u]) {
dfs(v) ;
sz[u] += sz[v] ;
}
}
}
|