IME++ Starters Try-outs 2019

IME++ Starters Try-outs 2019


题目


提示:以下是本篇文章正文内容,下面案例可供参考

A. Arnon-Degree of Separation

题目
在这里插入图片描述

题意:找到一个人到每一个人的中最短距离的最长距离,如果存在不能到达的人就直接输出“=[”反之输出“=]”并输出最短距离

思路:写一个node类,建立一个关于每个人的邻接表,然后对于每一个人进行BFS即可找到最短距离

import java.util.*;
public class M {
	static Scanner scanner=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=scanner.nextInt();//点的个数
		int m=scanner.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=scanner.nextInt();
			int w=scanner.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—LCM):LCM模板
AC代码:

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

题目# B. Building Bridges
在这里插入图片描述
题目:有n个队员进行组队,其中一个人可以呆在多个对里面,每个队的总分大于x,且队员的最大评分与最小评分差距小于d,求最多可以组多少个队

思路:由于n<=15数据较小,直接暴力dfs,剪枝就可以

AC代码:

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

题目
在这里插入图片描述
题意:从2*n个数分为n组,其中数值最大的与最小的差距最小
思路:直接排序,每次取两边的数
AC代码:

public class Main{
	static Scanner scanner=new Scanner(System.in);
	public static void main(String[] args) {
		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);
	//	System.out.println(Arrays.toString(a));
		long max=0,min=Long.MAX_VALUE;
		for(int i=0,j=a.length-1;i<j;i++,j--) {
			//System.out.println(i+"ppp"+j+" "+a[i]+" "+a[j]);
			max=Math.max(max, a[i]+a[j]);
			min=Math.min(min, a[i]+a[j]);
		}
		//System.out.println(max+" "+min);
		System.out.println(max-min);
	}
	private static void show() {
		
	}
}

E. Essay Time

题目

在这里插入图片描述
题意:字面意思
思路:直接将长度大于4的串装进set(数据过大卡Java)

F. Friendship Matters

题目
在这里插入图片描述
题意:给出n个人,和m组关系,判断某两个人是否是一组
思路:并查集模板题目
AC代码:

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

G. Grade Concept

题目
在这里插入图片描述
思路:线段树

H. High Hopes

题目
在这里插入图片描述
思路:0%x=0,感觉这题是个 BUG
AC代码:

public class Main{
	static Scanner scanner=new Scanner(System.in);
	public static void main(String[] args) {
		int n=scanner.nextInt();
		for(int i=0;i<n;i++) {
			show();
		}
	}
	private static void show() {
		int a=scanner.nextInt();
		int b=scanner.nextInt();
		System.out.println(0);
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值