A. Arnon-Degree of Separ
题目
斜体样式题解:就是构建一个nodes,然后用dfs找
import java.util.*;
public class M {
static Scanner sc=new Scanner(System.in);
static Node []nodes;
static Set<Integer>set;
static int ans=0;
static int aa[];//记录数据
public static void main(String[] args) {
int n=sc.nextInt();//点的个数
int m=sc.nextInt();//边的个数
nodes=new Node[n+1];
for(int i=1;i<=n;i++) {
nodes[i]=new Node();
}
for(int i=0;i<m;i++) {//直接加边
int v=sc.nextInt();
int w=sc.nextInt();
nodes[v].list.add(w);
nodes[w].list.add(v);
}
for(int i=1;i<=n;i++) {
aa=new int [n+1];
Arrays.fill(aa, n+10);
aa[i]=0;
set=new HashSet<Integer>();
Queue<Integer>queue=new LinkedList<>();
queue.add(i);
while(!queue.isEmpty()) {//BFS
int q=queue.remove();
for(int x:nodes[q].list) {
if(aa[x]==n+10) {//表示该点没有到达过
queue.add(x);
aa[x]=Math.min(aa[x], aa[q]+1);
}
}
}
//System.out.println(Arrays.toString(aa));
for(int o=1;o<=n;o++) {
if(aa[o]==n+10) {
System.out.println("=[");
return;
}else {
ans=Math.max(aa[o], ans);
}
}
}
System.out.println("=] "+ans);
}
static class Node{
List<Integer>list;
public Node() {
this.list = new LinkedList<>();
}
}
}
B. Building Bridges
题目
题解:给出两个字符串,找到相同 的字母进行连接,并且每次连接的线不能出现交叉的情况。所以就用DP就行。
public class Main{
static Scanner scanner=new Scanner(System.in);
public static void main(String[] args) {
char a[]=scanner.next().toCharArray();
char b[]=scanner.next().toCharArray();
int max=0;
int dp[][]=new int [a.length+1][b.length+1];
for(int i=1;i<dp.length;i++) {
for(int j=1;j<dp[0].length;j++) {
if(a[i-1]==b[j-1]) {
dp[i][j]=dp[i-1][j-1]+1;
}else {
dp[i][j]=Math.max(dp[i][j-1], dp[i-1][j]);
}
max=Math.max(max, dp[i][j]);
}
}
System.out.println(max);
}
}
C. Coach
题目
题解:就是说有n个队员,然后分的组的最大技能和最小技能之间不能差d,看可以找出来多少组。然后就可以直接DFS,
这个题给2019年的蓝桥有一题很相似。
public class M {
static Scanner scanner=new Scanner(System.in);
static long []a;
static int x,d,ans;
public static void main(String[] args) {
int n=scanner.nextInt();
x=scanner.nextInt();
d=scanner.nextInt();
a=new long [n];
for(int i=0;i<n;i++) {
a[i]=scanner.nextInt();
}
Arrays.sort(a);
for(int i=0;i<n;i++) {
dfs(i,a[i],a[i]);
}
System.out.println(ans);
}
private static void dfs(int o,long min,long s) {
//System.out.println("pppp");
if(s>=x)ans++;
for(int i=o+1;i<a.length;i++) {
if(a[i]-min<=d)dfs(i, min,s+a[i]);
}
}
}
D. Donimo’s
题目
题解:排序,然后直接两头找。
public class Main{
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
long a[]=new long [n*2];
for(int i=0;i<2*n;i++) {
a[i]=scanner.nextInt();
}
Arrays.sort(a);
long max=0,min=Long.MAX_VALUE;
for(int i=0,j=a.length-1;i<j;i++,j--) {
max=Math.max(max, a[i]+a[j]);
min=Math.min(min, a[i]+a[j]);
}
System.out.println(max-min);
}
}
F. Friendship Matters
题目
题解:很典型的并查集的题目
import java.io.*;
import java.math.*;
import java.util.*;
public class Main {
static HashMap<String, Integer>map=new HashMap<>();
static int find(int arr[], int x) {//查找
if(arr[x]!=x) {
arr[x] = find(arr, arr[x]);
}
return arr[x];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m=sc.nextInt();
int arr[] = new int[n];
for(int i=0;i<n;i++) {
arr[i] = i;
map.put(sc.next(), i);
}
for(int i=0;i<m;i++) {
int s=sc.nextInt();
if(s==1) {
int a=find(arr, map.get(sc.next()));
int b=find(arr, map.get(sc.next()));
arr[a] = b;
}else {
int a=find(arr, map.get(sc.next()));
int b=find(arr, map.get(sc.next()));
if(a==b)System.out.println("yes");
else System.out.println("no");
}
}
}
}
H. High Hopes
题目
题解:0%x==0,看见了人家题解,感觉挺水
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
for(int i=0;i<n;i++) {
int a=sc.nextInt();
int b=sc.nextInt();
System.out.println(0);
}
}
}