2015年蓝桥杯

2、定时炸弹

1、题目
星系炸弹
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。

请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19
请严格按照格式书写。不能出现其它文字或符号。

2、思想
(1)calendar Api的使用,初始化使用Calendar.getInstance()方法
(2)设置某个时间使用cal.set(Calendar.YEAR,年份);方法
(3)向后加时间使用cal.add(Calendar.Date,天);
(4)输出:可以使用getTime得到直接方式的输出,有日期有星期
也可以使用toLocaleString() 得到中文输出
(5)关于日期方法总结:
https://blog.csdn.net/weixin_42673117/article/details/105024015

3、代码

package com.lanqiao.prepro;

import java.util.Calendar;
import java.util.Date;

public class a20052 {
	public static void main(String[] args) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, 2014);
		cal.set(Calendar.MONTH, 10);
		cal.set(Calendar.DATE, 9);
		cal.add(Calendar.DATE, 1000);
		System.out.println(cal.getTime().toLocaleString());
	}
}

3、组数字

1、题目
1~9的数字可以组成3个3位数,设为:A,B,C, 现在要求满足如下关系:
B = 2 * A
C = 3 * A

请你写出A的所有可能答案,数字间用空格分开,数字按升序排列。

注意:只提交A的值,严格按照格式要求输出。

2、思想
(1)注意每次判断完数组之后进行恢复

3、代码

package com.lanqiao.prepro;

import java.util.Arrays;

public class a20053 {
	static int[] arr;
	public static void main(String[] args) {
		arr = new int[10];
		Arrays.fill(arr, 0);
		for(int a=100;a<1000;a++)
		{
			int b=2*a;
			int c = 3*a;
			if(b>100&&b<1000&&c>100&&c<1000)
			{
				if(check(a,b,c))
				{
					System.out.println(a+" "+b+" "+c);
				}
				
			}
			Arrays.fill(arr, 0);
		}
	}
	private static boolean check(int a, int b, int c) {
		boolean flag = true;
		while(a>0)
		{
			arr[a%10]=1;
			a/=10;
		}
		while(b>0)
		{
			arr[b%10]=1;
			b/=10;
		}
		while(c>0)
		{
			arr[c%10]=1;
			c/=10;
		}
		for(int i=1;i<=9;i++)
		{
			if(arr[i]==0) flag=false;
		}
		return flag;
	}
}

4.循环节长度

1、题目
两个整数做除法,有时会产生循环小数,其循环部分称为:循环节。
比如,11/13=6=>0.846153846153… 其循环节为[846153] 共有6位。
下面的方法,可以求出循环节的长度。
请仔细阅读代码,并填写划线部分缺少的代码。

2、思想
(1)填空题不能直接蒙,第一个还好,第二个还是要结合着题目来看
(2)根据试探,发现s1、s2已经上下两部分都填好了,重点就是s如何补充
(3)想着考点,这个地方很明显,考点就是substring的运用
(4)分析题目中形状的变化,得出每次只是截掉s后面三个字符

3、代码

package com.lanqiao.prepro;

public class a20055 {
	public static void f(int n)
    {
        String s = "*";
        for(int i=0; i<2*n-3; i++) s += ".";
        s += "*";
    
        String s1 = s + "\n";
        String s2 = "";
        
        for(int i=0; i<n-1; i++){
//            System.out.println("=>"+s);
            s = "." +s.substring(0,s.length()-3)+ "*";  //填空代码为中间一部分
            s1 = s + "\n" + s1;
            s2 += s + "\n";
        }
        System.out.println(s1+s2);        
    }
    
    public static void main(String[] args)
    {
        f(8);
    }
}

6、加法变乘法

我们都知道:1+2+3+ … + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015

比如:
1+2+3+…+1011+12+…+2728+29+…+49 = 2015
就是符合要求的答案。

请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。

注意:需要你提交的是一个整数,不要填写任何多余的内容。

2、思想
注意:申请题,在做题!!!
一开始认为成了三部分之积,搞了好久才反应过来,只是中间两个数相乘!

3、代码

package com.lanqiao.prepro;

public class a20056 {
	public static void main(String[] args) {
		int sum1=0,sum2=0,sum3=0;
		int x1=0,x2=0;
		
		for(int i=1;i<50;i++)
		{
			sum1+=i;
			x1=(i+1)*(i+2);
			for(int j=i+3;j<50;j++)
			{
				sum2+=j;
				x2=(j+1)*(j+2);
				for(int k=j+3;k<50;k++)
				{
					
					sum3+=k;
				}
				if(sum1+sum2+sum3+x1+x2==2015)
				{
					System.out.println(i+" "+j+" ");
				}
				sum3=0;
			}
			sum2=0;
		}
	}
}

7、牌型种数

小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

请填写该整数,不要填写任何多余的内容或说明文字。

2、思想
(1)对dfs认知太刻板,只知道全排列的模板,不知道其他dfs
(2)dfs具体作用:适用于选择,组合多少个东西,有多少种方式等
(3)注意dfs中for循环,可以从0开始表示每一种选多少个,注意0个的存在

3、代码

package com.lanqiao.prepro;

public class a20058 {
	static int[] arr;
	static int ans;
	public static void main(String[] args) {
		ans=0;
		f(0,0);
		System.out.println(ans);
	}
	private static void f(int k, int cur) {
		if(k>13||cur>13)
		{
			return;
		}
		if(cur==13)
		{
			ans++;
			return;
		}
		for(int i=0;i<5;i++)//注意0张牌,也是一种情况!!
		{
			f(k+1,cur+i);
		}
	}
}

9、垒骰子

1、题目
赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。
经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!
我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。
假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。 atm想计算一下有多少种不同的可能的垒骰子方式。
两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。
由于方案数可能过多,请输出模 10^9 + 7 的结果。

不要小看了 atm 的骰子数量哦~

「输入格式」
第一行两个整数 n m
n表示骰子数目
接下来 m 行,每行两个整数 a b ,表示 a 和 b 不能紧贴在一起。

「输出格式」
一行一个数,表示答案模 10^9 + 7 的结果。

「样例输入」
2 1
1 2

「样例输出」
544

「数据范围」
对于 30% 的数据:n <= 5
对于 60% 的数据:n <= 100
对于 100% 的数据:0 < n <= 10^9, m <= 36

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

2、思想
(1)第九题先想递归的想法
(2)从最上面的骰子开始,有6中选择(以冲上面的点数为代表)
(3)然后最上面一个看成一部分,下面的所有看成一部分
(4)根据下面是否符合条件进行判定

3、代码

package com.lanqiao.prepro;

import java.util.Arrays;
import java.util.Scanner;

public class a20059 {
	static int ans=0;
	static int sum=1;
	static int m,n;
	static int[][] arr;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n=sc.nextInt();
		m=sc.nextInt();
		arr = new int[7][7];
		for(int i=0;i<7;i++)
			for(int j=0;j<7;j++)
				arr[i][j]=0;
		
		for(int i=0;i<m;i++)
		{
			int a=sc.nextInt();
			int b=sc.nextInt();
			arr[a][b]=1;
			arr[b][a]=1;
		}
//		Utils.print(arr);
		f(n,1);
		System.out.println(ans);
	}
	private static void f(int k,int m) {
		if(k==0)
		{
			if(sum>1)
			ans+=sum;
			ans%=Math.pow(10, 9)+7;
			sum=1;
			return;
		}
		for(int i=1;i<=6;i++)
		{
//			System.out.println(ans);
			if(arr[i][(m+3)%7]==0&&k!=n) sum*=16;
			else if(arr[i][(m+3)%7]==1) {
				continue;
			}
			f(k-1,i);
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蓝桥杯是中国大学生信息学竞赛的一个重要赛事,2015蓝桥杯中有一道题目是关于Java编程的,题目是“熊怪吃核桃”。 这道题目是一个经典的动态规划问题,需要使用Java语言编写程序来解决。题目中给出了一个正整数n表示核桃的数量,以及一个正整数m表示熊怪的数量。在不超过熊怪数量的条件下,熊怪可以选择吃1个、2个或者3个核桃,每次吃完后核桃的数量会减少,熊怪的数量也会减少。如果最后可以吃完所有的核桃,则输出"YES",否则输出"NO"。 解决这个问题的思路是使用动态规划算法,首先定义一个二维数组dp,其中dp[i][j]表示熊怪数量为i时,核桃数量为j时是否可以吃完。然后使用动态规划的思想,从dp[0][0]开始推导出dp[m][n],最后输出结果即可。 具体的代码实现如下: ``` import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); // 核桃数量 int m = scanner.nextInt(); // 熊怪数量 // 定义dp数组 boolean[][] dp = new boolean[m + 1][n + 1]; // 初始化边界条件 dp[0][0] = true; // 使用动态规划递推 for (int i = 1; i <= m; i++) { for (int j = 0; j <= n; j++) { if (j >= i && dp[i - 1][j - i]) { dp[i][j] = true; } } } // 输出结果 if (dp[m][n]) { System.out.println("YES"); } else { System.out.println("NO"); } } } ``` 这道题目可以帮助我们理解动态规划算法的思想,并且熟悉Java语言的基本编程技巧。通过解决这道题目,我们可以提高编程能力和逻辑思维能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值