IME++ Starters Try-outs 2019

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);
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值