IME++ Starters Try-outs 2019 题解
- A. Arnon-Degree of Separation
- B. Building Bridges
- C. Coach
- D. Donimo's
- E. Essay Time
- F. Friendship Matters
A. Arnon-Degree of Separation
**题目大意:**找到人和人之间有直接联系的最长距离,如果存在不能到达的人就直接输出“=[”反之输出“=]”并输出最短距离
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Scanner; public class A { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int m=sc.nextInt(); node a[]=new node[n+1]; for(int i=1;i<=n;i++) { a[i]=new node(); } for (int i = 0; i < m; i++) { int a1=sc.nextInt(); int a2=sc.nextInt(); //储存 a[a1].list.add(a2); a[a2].list.add(a1); } int count=0; for (int i = 1; i <= n; i++) { Queue<Integer> queue=new LinkedList<>(); boolean[] arr=new boolean [n+1];//标记为都没走 int b[]=new int [n+1]; //记录走的步数 arr[i]=true;//标记 b[i]=0; queue.offer(i);//放入队列之中 while(!queue.isEmpty()) { int q=queue.poll();//弹出 for (int nextX : a[q].list) {//逐个便利相邻的数字 if(!arr[nextX]) {//如果没到达 arr[nextX]=true;//标记 queue.offer(nextX);//放入队列中 b[nextX]=b[q]+1;//纪录连接距离 } } } for (int j = 1; j < arr.length; j++) { if(!arr[j]) { System.out.println("=["); return; } } for (int j : b) { count=Math.max(count, j); } } System.out.println("=] "+count); } } class node{ List<Integer> list=new ArrayList<Integer>(); public List<Integer> getList() { return list; } public void setList(List<Integer> list) { this.list = list; } }
B. Building Bridges
题解:没读题,第一眼感觉就是LCS,写了一个模板,然后对了。dp的LCS模板题
import java.util.Scanner; public class B { public static void main(String[] args) { Scanner sc=new Scanner(System.in); String s1=sc.next(); String s2=sc.next(); int max=-1; int dp[][]=new int [s1.length()+1][s2.length()+1]; for (int i = 1; i < dp.length; i++) { for (int j = 1; j < dp[0].length; j++) { if(s1.charAt(i-1)==s2.charAt(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); sc.close(); } }
C. Coach
题意:找打>x,同时队员之差小于等于d的组合数
**题解:**数据量很小,直接排序,然后剪枝就行
import java.util.Arrays; import java.util.Scanner; public class C { static int count=0; static int n,x,d; static long a[]; public static void main(String[] args) { Scanner sc=new Scanner(System.in); n=sc.nextInt();x=sc.nextInt();d=sc.nextInt(); a=new long [n]; for (int i = 0; i < a.length; i++) { a[i]=sc.nextLong(); } Arrays.sort(a); for (int i = 0; i < a.length; i++) { dsf(i,a[i],a[i]); } System.out.println(count); } private static void dsf(int k, long min,long sum) { if(sum>x) count++; for (int i = k+1; i < a.length; i++) { if(a[i]-min<=d) dsf(i, min, sum+a[i]); } } }
D. Donimo’s
题解:水题,直接排序,找到前后两个数之和相加得到的最大数字和最小数字的差
package test; import java.util.Arrays; import java.util.Scanner; public class D { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int t=sc.nextInt()*2; long a[]=new long [t]; for (int i = 0; i < a.length; i++) { a[i]=sc.nextLong(); } Arrays.sort(a); long max=Integer.MIN_VALUE; long min=Integer.MAX_VALUE; for (int i = 0; i <=t/2; i++) { long sum=a[i]+a[t-1-i]; max=Math.max(max, sum); min=Math.min(min, sum); } System.out.println(max-min); sc.close(); } }
E. Essay Time
题解:将长度大于四的List1里面,然后如果已经存进去了的再存进去一个List2里,但是java过不了,卡java的题
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Scanner; import java.util.Set; public class E1 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int t=sc.nextInt(); Set <String >map1=new HashSet<String>(); List <String >map2=new ArrayList<String>(); while(t-->0) { String s=sc.next(); if(s.length()>=4) { if(!map1.contains(s)) { map1.add(s); }else { map2.add(s); } } } System.out.println(map2.size()); for (String string : map2) { System.out.println(string); } } }
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"); } } } }