蓝桥杯省赛2017部分题解

1,k倍区间

用集合HashMap蛮力解决

package java2017;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.function.BiConsumer;

public class k倍区间 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int k = scanner.nextInt();
		int[] pre = new int[n + 1];
		int count = 0;
		HashMap<Integer, Integer> map = new HashMap<>();
		for (int i = 1; i < pre.length; i++) {
			
			pre[i] = pre[i - 1] + scanner.nextInt();
			if(pre[i]%k==0) {
				count++;
				if (!map.containsKey(pre[i] % k)) {

					map.put(pre[i] % k, 1);
				} else {
					count+=map.get(pre[i] % k);
					map.put(pre[i] % k, map.get(pre[i] % k) + 1);
				}
			}else {
				if (!map.containsKey(pre[i] % k)) {

					map.put(pre[i] % k, 1);
				} else {
					count+=map.get(pre[i] % k);
					map.put(pre[i] % k, map.get(pre[i] % k) + 1);
				}
			}
		}
		System.out.println(count);
		 map.forEach(new BiConsumer<Integer, Integer>() {

	    		@Override
	    		public void accept(Integer key, Integer value) {
	    			// TODO Auto-generated method stub
	    			System.out.printf("%s:%s",key,value);
	    			System.out.println();
	    		}
	    	});
		
	}
}

用前缀和解决

package java2017;
import java.util.Scanner;

public class K倍区间前缀和 {
	private static int[] s;
	private static int ans = 0;
	private static int[] mod = new int[100000];

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int k = scanner.nextInt();
		s = new int[n + 10];
		for (int i = 1; i <= n; i++) {
			int t = scanner.nextInt();
//			前缀和
			s[i] = s[i - 1] + t;

		}
//		同余定理
		for (int i = 0; i <= n; i++) {
			int p = mod[s[i] % k]++;
			ans += p;
			System.out.println(p);
		}
		System.out.println(ans);

	}
}

2,凑包子

package java2017;

import java.util.Scanner;

public class 凑包子 {
	private static int n, g;
	private static int[] a = new int[101];
	private static boolean[] f = new boolean[10000];

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		n = scanner.nextInt();

		f[0] = true;
		for (int i = 1; i <= n; i++) {
			a[i] = scanner.nextInt();
			if (i == 1)
				g = a[i];
			else {
				g = gcd(a[i], g);
			}
			for (int j = 0; j < 10000-a[i]; j++) {
				if (f[j])
					f[j + a[i]] = true;
			}
		}
		int ans = 0;
		if (g != 1) {
			System.out.println("INF\n");
			return;
		}
		for (int j = 0; j < 10000; j++) {
			if (!f[j]) {
				System.out.println(j);
				ans++;
			}
		}

		System.out.println(ans);
	}

	private static int gcd(int a, int b) {
		if (b == 0)
			return a;
		if (b > a) {
			a = a ^ b;
			b = b ^ a;
			a = a ^ b;
		}
		return gcd(b, a % b);

	}
}

3,分巧克力

package java2017;

import java.util.Scanner;

public class 分巧克力二分 {
	private static int r = 0;
	private static int l = 0;
	private static int n = 0;
	private static int[][] kk;
	private static int k;

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		n = scanner.nextInt();
		k = scanner.nextInt();
		kk = new int[n][2];
		
		for (int i = 0; i < n; i++) {
			kk[i][0] = scanner.nextInt();
			kk[i][1] = scanner.nextInt();
			r = Math.max(kk[i][0], kk[i][1]);
		}

		while (l < r) {
			int mid = (l + r + 1) / 2;

			if (check(mid)) {
				l = mid;
			} else {
				r = mid - 1;
			}
		}
		System.out.println(l);
	}

	private static boolean check(int mid) {
		int ans = 0;
		for (int i = 0; i < n; i++) {

			ans += (kk[i][0] / mid) * (kk[i][1] / mid);

		}

		return ans >= k;
	}
}

4,承压计算

							  7 
                             5 8 
                            7 8 8 
                           9 2 7 2 
                          8 1 4 9 1 
                         8 1 8 8 4 1 
                        7 9 6 1 4 5 4 
                       5 6 5 5 6 9 5 6 
                      5 5 4 7 9 3 5 5 1 
                     7 5 7 9 7 4 7 3 3 1 
                    4 6 4 5 5 8 8 3 2 4 3 
                   1 1 3 3 1 6 6 5 5 4 4 2 
                  9 9 9 2 1 9 1 9 2 9 5 7 9 
                 4 3 3 7 7 9 3 6 1 3 8 8 3 7 
                3 6 8 1 5 3 9 5 8 3 8 1 8 3 3 
               8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9 
              8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4 
             2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9 
            7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6 
           9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3 
          5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9 
         6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4 
        2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4 
       7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6 
      1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3 
     2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8 
    7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9 
   7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6 
  5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1 
 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 
其中的数字代表金属块的重量(计量单位较大)。
最下一层的X代表30台极高精度的电子秤。

假设每块原料的重量都十分精确地平均落在下方的两个金属块上,
最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。
电子秤的计量单位很小,所以显示的数字很大。

工作人员发现,其中读数最小的电子秤的示数为:2086458231

请你推算出:读数最大的电子秤的示数为多少?
package java2017;

import java.util.Arrays;
import java.util.Iterator;

import org.omg.DynamicAny._DynUnionStub;

public class 承压计算 {
	public static void main(String[] args) {
		double[][] num = { 
				{ 7 }, 
				{ 5, 8 }, 
				{ 7, 8, 8 }, 
				{ 9, 2, 7, 2 },
				{ 8, 1, 4, 9, 1 }, 
				{ 8, 1, 8, 8, 4, 1 },
				{ 7, 9, 6, 1, 4, 5, 4 },
				{ 5, 6, 5, 5, 6, 9, 5, 6 }, 
				{ 5, 5, 4, 7, 9, 3, 5, 5, 1 },
				{ 7, 5, 7, 9, 7, 4, 7, 3, 3, 1 }, 
				{ 4, 6, 4, 5, 5, 8, 8, 3, 2, 4, 3 },
				{ 1, 1, 3, 3, 1, 6, 6, 5, 5, 4, 4, 2 },
				{ 9, 9, 9, 2, 1, 9, 1, 9, 2, 9, 5, 7, 9 },
				{ 4, 3, 3, 7, 7, 9, 3, 6, 1, 3, 8, 8, 3, 7 },
				{ 3, 6, 8, 1, 5, 3, 9, 5, 8, 3, 8, 1, 8, 3, 3 },
				{ 8, 3, 2, 3, 3, 5, 5, 8, 5, 4, 2, 8, 6, 7, 6, 9 },
				{ 8, 1, 8, 1, 8, 4, 6, 2, 2, 1, 7, 9, 4, 2, 3, 3, 4 },
				{ 2, 8, 4, 2, 2, 9, 9, 2, 8, 3, 4, 9, 6, 3, 9, 4, 6, 9 },
				{ 7, 9, 7, 4, 9, 7, 6, 6, 2, 8, 9, 4, 1, 8, 1, 7, 2, 1, 6 },
				{ 9, 2, 8, 6, 4, 2, 7, 9, 5, 4, 1, 2, 5, 1, 7, 3, 9, 8, 3, 3 },
				{ 5, 2, 1, 6, 7, 9, 3, 2, 8, 9, 5, 5, 6, 6, 6, 2, 1, 8, 7, 9, 9 },
				{ 6, 7, 1, 8, 8, 7, 5, 3, 6, 5, 4, 7, 3, 4, 6, 7, 8, 1, 3, 2, 7, 4 },
				{ 2, 2, 6, 3, 5, 3, 4, 9, 2, 4, 5, 7, 6, 6, 3, 2, 7, 2, 4, 8, 5, 5, 4 },
				{ 7, 4, 4, 5, 8, 3, 3, 8, 1, 8, 6, 3, 2, 1, 6, 2, 6, 4, 6, 3, 8, 2, 9, 6 },
				{ 1, 2, 4, 1, 3, 3, 5, 3, 4, 9, 6, 3, 8, 6, 5, 9, 1, 5, 3, 2, 6, 8, 8, 5, 3 },
				{ 2, 2, 7, 9, 3, 3, 2, 8, 6, 9, 8, 4, 4, 9, 5, 8, 2, 6, 3, 4, 8, 4, 9, 3, 8, 8 },
				{ 7, 7, 7, 9, 7, 5, 2, 7, 9, 2, 5, 1, 9, 2, 6, 5, 3, 9, 3, 5, 7, 3, 5, 4, 2, 8, 9 },
				{ 7, 7, 6, 6, 8, 7, 5, 5, 8, 2, 4, 7, 7, 4, 7, 2, 6, 9, 2, 1, 8, 2, 9, 8, 5, 7, 3, 6 },
				{ 5, 9, 4, 5, 5, 7, 5, 5, 6, 3, 5, 3, 9, 5, 8, 9, 5, 4, 1, 2, 6, 1, 4, 3, 5, 3, 2, 4, 1 },
				{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
		for (int i = 1; i < num.length; i++) {
			for (int j = 0; j < num[i].length; j++) {
				if (j == 0) {
					num[i][0] += num[i - 1][0] / 2;
				} else if (j == num[i].length - 1) {
					num[i][j] += num[i - 1][j - 1] / 2;
				} else {
					num[i][j] += num[i - 1][j - 1] / 2 + num[i - 1][j] / 2;
				}
			}
		}
		double min = num[29][0];
		double max = num[29][1];
		for (int i = 2; i < num[29].length; i++) {
			if (num[29][i] < min) {
				min = num[29][i];
			}
			if (num[29][i] > max) {
				max = num[29][i];
			}
			
		}
System.out.println("max:"+max);
System.out.println("min:"+min);
System.out.println((max *2086458231) / min );
	}
}

5,最长公共子串和最长公共子序列

package java2017;

public class 最长公共子串 {

	private static int start=0;

	static int f(String s1, String s2) {
		char[] c1 = s1.toCharArray();
		char[] c2 = s2.toCharArray();

		int[][] a = new int[c1.length + 1][c2.length + 1];

		int max = 0;
		for (int i = 1; i < a.length; i++) {
			for (int j = 1; j < a[i].length; j++) {
				
				if (c1[i - 1] == c2[j - 1]) {
					a[i][j] =a[i-1][j-1]+1; // 填空
					if (a[i][j] > max) {
						max = a[i][j];
						start=i-max;
					}
				}
			}
		}
        System.out.println(s1.substring(start,start+max));
		return max;
	}
	public static void main(String[] args) {
		int n = f("abcdkkk", "baabcdadabc");
		System.out.println(n);
	}
}
package java2017;

import java.util.Arrays;
import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;

public class 最长公共子序列 {
	private static char s1[];
	private static char s2[];
	private static int [][]dp;
	private static TreeSet<String> set=new TreeSet<>();
public static void main(String[] args) {
	Scanner scanner=new Scanner(System.in);
	s1=scanner.next().toCharArray();
	s2=scanner.next().toCharArray();
	System.out.println(Arrays.toString(s1));
	System.out.println(Arrays.toString(s2));
	dp=new int[s1.length+1][s2.length+1];
	int maxlength= lmax();
	System.out.println(maxlength);
	String str="";
	printMaxLength(s1.length,s2.length,str);
	Iterator<String> iterator = set.iterator();
	while(iterator.hasNext()) {
		System.out.println(iterator.next());
	}
}
private static void printMaxLength(int n,int m,String str) {
	while(n>0&m>0) {
		if(s1[n-1]==s2[m-1]) {
			n--;
			m--;
			str=s1[n]+str;
		}else {
			if(dp[n-1][m]>dp[n][m-1]) {
				n--;
				
			}else if(dp[n-1][m]<dp[n][m-1]) {
				m--;
			}else {
				printMaxLength(n-1,m,str);
				printMaxLength(n,m-1,str);
				return;
			}
		}
	}
	if(str.length()>0) set.add(str);
}
private static int lmax() {
	
	for(int n=1;n<=s1.length;n++) {
		for(int m=1;m<=s2.length;m++) {
			
			if(s1[n-1]==s2[m-1]) {
				    dp[n][m]=dp[n-1][m-1]+1;
			}else {
					dp[n][m]=Math.max(dp[n-1][m],dp[n][m-1]);
			}
		}
	}
	return dp[s1.length][s2.length];
}
}

6,魔方状态

package java2017;

import java.util.Arrays;
import java.util.HashSet;

public class 魔方状态 {
	private static int []a= {1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3};
	private static boolean[]vis=new boolean[24];
	private static int num=0;
	private static HashSet<String> set=new HashSet<>();
public static void main(String[] args) {
	int []path=new int[24];
	
	f(0);
	
	System.out.println(set.size());
}
private static void f(int k) {
     if(k==24) {
    	set.add(Arrays.toString(a));
    	
     }
	for(int i=k;i<24;i++) {

		int temp=a[k];
		a[k]=a[i];
		a[i]=temp;
		
		f(k+1);
		
		temp=a[k];
		a[k]=a[i];
		a[i]=temp;
	}
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值