2014-2015蓝桥杯省赛部分题解

1,垒骰子

//递归
package java2014;
import java.util.Scanner;
public class 垒骰子递归 {
	public static boolean conlist[][] = new boolean[7][7];
	public static int op[] = new int[7];
	private static int MOD = 1000000007;
	public static void main(String[] args) {
		int n = 0;
		int m = 0;
		long ans = 0;
		Scanner scanner = new Scanner(System.in);
		n = scanner.nextInt();
		m = scanner.nextInt();
		op[1] = 4;
		op[4] = 1;
		op[5] = 2;
		op[2] = 5;
		op[3] = 6;
		op[6] = 3;
		for (int i = 1; i <= m; i++) {
			int x = scanner.nextInt();
			int y = scanner.nextInt();
			conlist[x][y] = true;
			conlist[y][x] = true;
		}
		for (int up = 1; up <= 6; up++) {
			ans = ans + 4 * f(up, n - 1);
		}
		System.out.println((ans) % MOD);
	}
	private static long f(int up, int cnt) {
		long ans = 0;
		if (cnt == 0)
			return 4;
		for (int upp = 1; upp <= 6; upp++) {
			if (conlist[op[up]][upp])
				continue;
			ans = ans + f(upp, cnt - 1);
		}
		return ans;
	}
}

2,垒骰子-》动态规划

    

package java2014;

import java.util.Scanner;

public class 垒骰子动态规划 {
	public static boolean conlist[][] = new boolean[7][7];// 判断两个面是否互斥
	public static int op[] = new int[7];// 映射互斥面
	private static int MOD = 1000000007;
	private static int dp[][] = new int[2][7];
	public static void main(String[] args) {
		int n = 0;
		int m = 0;
		Scanner scanner = new Scanner(System.in);
		n = scanner.nextInt();
		m = scanner.nextInt();
		op[1] = 4;
		op[4] = 1;
		op[5] = 2;
		op[2] = 5;
		op[3] = 6;
		op[6] = 3;
		for (int i = 1; i <= m; i++) {
			int x = scanner.nextInt();
			int y = scanner.nextInt();
			conlist[x][y] = true;
			conlist[y][x] = true;
		}
//	滚动数组
		// 初始化滚动数组第一行
		for (int i = 1; i <= 6; i++) {
			dp[0][i] = 1;
		}
		int cur = 0;
		for (int leval = 2; leval <= n; leval++) {
			cur = 1 - cur;
			// 接下来要放的骰子那面朝上
			for (int i = 1; i <= 6; i++) {
				dp[cur][i] = 0;
				for (int j = 0; j <= 6; j++) {
					if (conlist[op[i]][j])
						continue;
					dp[cur][i] = (dp[cur][i] + dp[1 - cur][j]) % MOD;
				}
			}
		}
		long sum = 0;
		for (int up = 1; up <= 6; up++) {
			sum = (sum + dp[cur][up]) % MOD;
		}
		// 快速幂求n次方
		long ans = 1;
		long tmp = 4;
		long p = n;
		while (p != 0) {
			if ((p & 1) == 1)
				ans = (ans * tmp) % MOD;
			tmp = (tmp * tmp) % MOD;
			p >>= 1;
		}
		System.out.println((sum * ans) % MOD);
	}
}

2,生命之树

package java2014;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class 生命之树 {
private static List<Integer> []g;
private static int n=1;
private static int ans=-1;
private static int []w;
public static void main(String[] args) {
	Scanner scanner=new Scanner(System.in);
	
	n=scanner.nextInt();
	w=new int[n+1];
    g=new ArrayList[n+1];
	for(int i=1 ;i<=n;i++) {
		w[i]=scanner.nextInt();
	}
	for(int i=1 ;i<=n;i++) {
		g[i]=new ArrayList<>();
	}
	
	for(int i=0;i<n-1;i++) {
		int a=scanner.nextInt();
		int b=scanner.nextInt();
		g[a].add(b);
		g[b].add(a);
	}
	dfs(1,0);
	System.out.println(ans);
}

private static void dfs(int u,int fg) {
	for(int i=0;i<g[u].size();i++) {
		Integer child=g[u].get(i);
		if(child==fg)continue;
		dfs(child, u);
		if(w[child]>0) {
			w[u]+=w[child];
		}
		if(w[u]>ans)ans=w[u];		
	}
}
}

3,移动距离

package java2014;

import java.time.Year;
import java.util.Scanner;

public class 移动距离 {
	private static int ans;

	public static void main(String[] args) {
       Scanner scanner = new Scanner(System.in);
       
       int w=scanner.nextInt();
       int m=scanner.nextInt();
       int n=scanner.nextInt();
       
       int x1=x(m,w);
       int x2=x(n,w);
       int y1=y(m,w);
       int y2=y(n,w);
       
       ans=Math.abs(x2-x1)+Math.abs(y2-y1);
       
    		System.out.println(ans);   
	}

	private static int y(int m, int w) {
		int x=x(m,w);
		int y=0;
		if(x%2==0) {
			
			y=w-(m-(x-1)*w);
		}else {
			y=(m-(x-1)*w)-1;
		}
		return y;
	}

	private static int x(int m, int w) {
		int l= m/w;
	       if(l==0) {
	    	   l=1;
	       }else {
			if((m%w)!=0) {
				l+=1;
			}
		}
	       return l;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值