1.武功秘籍

  • 小明到X山洞探险,捡到一本有破损的武功秘籍(2000多页!当然是伪造的)。他注意到:书的第10页和第11页在同一张纸上,但第11页和第12页不在同一张纸上。
  • 小明只想练习该书的第81页到第92页的武功,又不想带着整本书。请问他至少要撕下多少张纸带走?
  • 这是个整数,请通过浏览器提交该数字,不要填写任何多余的内容。

热身题

public class Main {
public static void main(String[] args) {
for(int i = 10; i < 100; i += 2){
System.out.println("本页包括 : " + i + " 和 " + (i + 1));
}
}
}
答案 : 7

2.切面条

  • 一根高筋拉面,中间切一刀,可以得到2根面条。
  • 如果先对折1次,中间切一刀,可以得到3根面条。
  • 如果连续对折2次,中间切一刀,可以得到5根面条。
  • 那么,连续对折10次,中间切一刀,会得到多少面条呢?
  • 答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。

我把它看成是一道考二叉树的题. 考的是第k层的结点个数, 但是最后要加1, 这个1可以理解成头结点. 拿张纸条切一切和二叉树的图对比一下即可.

public class Main {
public static void main(String[] args) {
System.out.println(getNoodles(10));
} public static int getNoodles(int n){
return (1 << n) + 1;
}
}
答案 : 1025

3. 猜字母

  • 把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
  • 接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
  • 得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
  • 答案是一个小写字母,请通过浏览器提交答案。不要填写任何多余的内容。

 

我的思路是先拼接出字符串, 然后通过数组原地调整的方式不断缩字符串, 类似2013年第八题幸运数.

public class Main {

	public static void main(String[] args) {
String s = "";
for(int i = 0; i < 106; i++){
s += "abcdefghijklmnopqrs";
}
char[] arr = s.toCharArray();
int len = arr.length;
int index = 0;
while(len != 1){
for(int i = 0; i < len; i++){
if(((i + 1) & 1) == 0){
arr[index++] = arr[i];
}
}
System.out.println(arr[0]);//把缩完后每一次的开头都打印出来, 以便检验.
index = 0;
len = len / 2;
}
}
}
答案 : q

4.大衍数列

  • 中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。
  • 它的前几项是:0、2、4、8、12、18、24、32、40、50 ...
  • 其规律是:对偶数项,是序号平方再除2,奇数项,是序号平方减1再除2。
  • 以下的代码打印出了大衍数列的前 100 项。
for(int i=1; i<100; i++)
{
if(________________) //填空
System.out.println(i*i/2);
else
System.out.println((i*i-1)/2);
}
  • 请填写划线部分缺失的代码。通过浏览器提交答案。
  • 注意:不要填写题面已有的内容,也不要填写任何说明、解释文字。

 

判断一个数是不是偶数

答案 : (i & 0) == 0

 


5.圆周率

  • 数学发展历史上,圆周率的计算曾有许多有趣甚至是传奇的故事。其中许多方法都涉及无穷级数。
  • 图1.png中所示,就是一种用连分数的形式表示的圆周率求法。
  • 下面的程序实现了该求解方法。实际上数列的收敛对x的初始值 并不敏感。
  • 结果打印出圆周率近似值(保留小数点后4位,并不一定与圆周率真值吻合)。
	double x = 111;
for(int n = 10000; n>=0; n--){
int i = 2 * n + 1;
x = 2 + (i*i / x);
} System.out.println(String.format("%.4f", ______________));

根据题目中的代码可以推算出x等于2+一大坨分数, 然后即可通过解方程得到圆周率.

答案 : 4/(x-1)

 


6.奇怪的分式

  • 上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:
  • 1/4 乘以 8/5
  • 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)
  • 老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!
  • 对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢?
  • 请写出所有不同算式的个数(包括题中举例的)
  • 显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。
  • 但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!
  • 注意:答案是个整数(考虑对称性,肯定是偶数。请通过浏览器提交。不要书写多余的内容。


 

解题思路: 按照题目的步骤判断两个结果是否相等, 两个结果分别用4个变量凑出, 注意判断相等的时候使用浮点类型.

public class Main {
public static void main(String[] args) {
int res = 0;
float num1 = 0;
float num2 = 0;
for(float a = 1; a <= 9; a++){
for(float b = 1; b <= 9; b++){
if(b == a) continue;
for(float c = 1; c <= 9; c++){
for(float d = 1; d <= 9; d++){
if(c == d) continue; num1 = (a * 10 + c) / (b * 10 + d);
num2 = (a * c) / (b * d);
if(num1 == num2){
res++;
}
}
}
}
}
System.out.println(res);
}
}
答案 : 14

 


7.扑克序列

  • A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
  • 要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
  • 请填写出所有符合要求的排列中,字典序最小的那个。
  • 例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
  • 请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。

 

解题思路: 首先通过全排列找到所有的情况, 然后在所有情况中筛选符合题目要求的字符串. 最后比较符合要求的字符串的字典序, 通过比较器比较(各个语言都有).

public class Main {

	public static LinkedList<String> qua = new LinkedList<String>();

	public static void main(String[] args) {
String str = "AA223344";
process(str.toCharArray(), 0);//全排列
ArrayList<String> preList = new ArrayList<String>();
//拿到符合要求的序列
for(String s : qua){
if(isOk(s)){
preList.add(s);
}
}
//按照字典序排序
Collections.sort(preList, new StringComparator());
System.out.println(preList.get(0));
} public static class Index{
public int first;
public int last;
public Index(int first){
this.first = first;
}
} public static boolean isOk(String s){
char[] arr = s.toCharArray();
HashMap<Character, Index> map = new HashMap<Character, T7.Index>();
for(int i = 0; i < arr.length; i++){
if(!map.containsKey(arr[i])){
map.put(arr[i], new Index(i));
}else{
Index index = map.get(arr[i]);
index.last = i;
map.put(arr[i], index);
}
}
Index a = map.get('A');
if(a.last - a.first - 1 != 1){
return false;
}
Index b = map.get('2');
if(b.last - b.first - 1 != 2){
return false;
}
Index c = map.get('3');
if(c.last - c.first - 1 != 3){
return false;
}
Index d = map.get('4');
if(d.last - d.first - 1 != 4){
return false;
}
return true;
} public static void process(char[] ori, int index){
if(index == ori.length){
qua.add(String.valueOf(ori));
return;
}
for(int i = index; i < ori.length; i++){
swap(ori, index, i);
process(ori, index + 1);
swap(ori, index, i);
}
} public static class StringComparator implements Comparator<String> {
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
} public static void swap(char[] ori, int i, int j){
char temp = ori[i];
ori[i] = ori[j];
ori[j] = temp;
}
}

答案: 2342A3A4

 


8.分糖果

  • 有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
  • 每个小朋友都把自己的糖果分一半给左手边的孩子。
  • 一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
  • 反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
  • 你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
【格式要求】

程序首先读入一个整数N(2<N<100),表示小朋友的人数。
接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
要求程序输出一个整数,表示老师需要补发的糖果数。 例如:输入
3
2 2 4
程序应该输出:
4 资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
  • 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
  • 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
  • 注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
  • 注意:主类的名字必须是:Main,否则按无效代码处理。

 

解题思路: 按照题目一路写代码

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[sc.nextInt()];//每个孩子有多少糖
int[] tempCandy = new int[arr.length];//定义一个辅助数组保存每个孩子给左边孩子给多少糖
for(int i = 0; i < arr.length; i++){
arr[i] = sc.nextInt();
} int left = 0;
int res = 0;
boolean equal = false;
//只要孩子的糖不相等就进行循环
while(!equal){
//每个孩子付出糖
for(int i = 0; i < arr.length; i++){
tempCandy[i] = arr[i] / 2;
arr[i] /= 2;
}
//每个孩子接收糖
for(int i = 0; i < arr.length; i++){
left = getLeftIndex(i, arr);
arr[left] += tempCandy[i];
}
//老师发糖平衡天下
for(int i = 0; i < arr.length; i++){
if((arr[i] & 1) != 0){
arr[i] += 1;
res++;
}
}
//看看这一轮平了没有
boolean isEqual = true;
for(int i = 1; i < arr.length; i++){
if(arr[i] != arr[i - 1]){
isEqual = false;
break;
}
}
equal = isEqual ? true : false;
}
System.out.println(res);
} public static int getLeftIndex(int index, int[] arr){
return index == 0 ? arr.length - 1 : index - 1;
}
}

 


9.地宫取宝

  • X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。
  • 地宫的入口在左上角,出口在右下角。
  • 小明被带到地宫的入口,国王要求他只能向右或向下行走。
  • 走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。
  • 当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。
  • 请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
数据格式】

输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12)

接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值

要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。

例如,输入:
2 2 2
1 2
2 1
程序应该输出:
2 再例如,输入:
2 3 2
1 2 3
2 1 5
程序应该输出:
14 资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms

思路:

  1. 递归的逻辑是: 如果当前格子的宝藏的值比手头上宝贝的最大值大, 就可以取走, 并且可以向右或向下走.
  2. 所以如果可以拿走宝贝, 就有4种情况; 如果不可以拿走宝贝就只有两种情况.见代码
  3. 如果只是这样写的话, 样本量大的时候会超时, 因为最多要连续走100个格子, 每个格子算2种选择, 2的100次方是很可怕的.
  4. 当以相同状态走过同一个格子的时候, 比如说x=2,y=2,max=4,cur=2, 如果之前经历过这样的状况, 就可以直接返回之前的结果了, 这里可以用一个数组进行记忆.

踩坑:

  1. 开始时, 我没有初始化记忆数组, 数组的每个格子都是0, 最后没有节省时间, 因为很多格子上记录的就是0, 只有0种取法.
  2. 没有留意题目种对结果取余的告诫, 只在最后return res之前取余数. 最终有3个测试用例过不了, 因为每次递归的结果都有可能超过1000000007, 最后才进行取余在样本量极大的情况下是会出错的.
public class T9 {

	public static int n;
public static int m;
public static int k;
public static int[][][][] dp = new int[50][50][15][15];//用于记忆搜索
public static int[][] arr = new int[50][50]; public static void main(String[] args) {
//处理输入
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
k = sc.nextInt();
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
arr[i][j] = sc.nextInt();
}
}
initDp();//初始化记忆数组,不能用java初始的0值,因为很多格子只有0种可能, 会造成重复搜索.
System.out.println(process(arr, 0, 0, -1, 0));//宝藏的最小值为0, 所以初始的max值为-1
} public static int process(int[][] arr, int x, int y, int max, int cur){
if(dp[x][y][max + 1][cur] != -1){//max初始为-1,为防止越界填入max+1
return dp[x][y][max + 1][cur];
}
if(x >= n || y >= m || cur > k){
return 0;
}
int value = arr[x][y];
if(x == n - 1 && y == m - 1){
if(cur == k || (value > max && cur == k - 1)){
return 1;
}
return 0;
}
int res = 0;
if(value > max){//如果宝藏大于当前手上的最大值, 就可以拿走.
res += process(arr, x, y + 1, value, cur + 1);//每次递归完对结果取模, 否则数据量大的时候会出错.
res %= 1000000007;
res += process(arr, x + 1, y, value, cur + 1);
res %= 1000000007;
}
//不拿走
res += process(arr, x, y + 1, max, cur);
res %= 1000000007;
res += process(arr, x + 1, y, max, cur);
res %= 1000000007; dp[x][y][max + 1][cur] = res;
return res;
} public static void initDp(){
for(int i = 0; i < 50; i++){
for(int j = 0; j < 50; j++){
for(int k = 0; k < 15; k++){
for(int l = 0; l < 15; l++){
dp[i][j][k][l] = -1;
}
}
}
}
}
}

 


10.矩阵翻硬币

  • 小明先把硬币摆成了一个 n 行 m 列的矩阵。
  • 随后,小明对每一个硬币分别进行一次 Q 操作。
  • 对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进行翻转。
  • 其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。
  • 当小明对所有硬币都进行了一次 Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。
  • 小明想知道最开始有多少枚硬币是反面朝上的。于是,他向他的好朋友小M寻求帮助。
  • 聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,即可恢复到最开始的状态。然而小明很懒,不愿意照做。于是小明希望你给出他更好的方法。帮他计算出答案。

-【数据格式】

  • 输入数据包含一行,两个正整数 n m,含义见题目描述。
  • 输出一个正整数,表示最开始有多少枚硬币是反面朝上的。
【样例输入】
2 3 【样例输出】
1 【数据规模】
对于10%的数据,n、m <= 10^3;
对于20%的数据,n、m <= 10^7;
对于40%的数据,n、m <= 10^15;
对于10%的数据,n、m <= 10^1000(10的1000次方)。 资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms

思路

  • 用题目中的操作只能过10%的数据.
  • 首先要理解Q操作的定义:将所有第i*x 行,第j*y 列的硬币进行翻转. 也就是说现在定位的硬币坐标是x,y, 是x的倍数的行都要翻, 是y的倍数的列也要翻.
  • 假设有9行9列的硬币, 对坐标(9,9)的硬币target进行分析. 第一行的硬币命中了target的行, 假如来到第一列, 那么target就要翻一下; 假如来到了第1行, 第3列, target也要翻一下.
  • 这么一来, 一个硬币就要翻 (x的因子数 * y的因子数) 那么多次
  • 如果一个数一共翻了奇数次, 它一开始就是反面朝上的.
  • 由于只有奇数相乘才能得到奇数. 所以要求x的因子数和y的因子数都必须是奇数.
  • 什么数的因子数是奇数? 只有平方数的因子数是奇数, 因为普通数的因子数都是一对一对的.
  • 所以现在的问题转化成求x中有多少个平方数y中有多少个平方数.
  • 平方数有: 1, 4, 9...
  • 根据数学规律, 求一个数包含多少个平方数只需要将该数开方后向下取整即可, 比如说10开方取整后得3, 它一共包含3个平方数.
  • 由于数据的取值范围是10^1000, 不能用已有的基本数据类型进行开放, 所以接下来的问题转化为如何对一个大数进行开方.
  • 首先要知道大数有多少位, 比如两位数16开方后得一位数4, 3位数100开方后得2位数10. 总结出结果是如果一个数的位数是偶数, 开方后得到的数的位数也是偶数, 如果是奇数, 得出的结果有原数位数 / 2 + 1 这么多位.
  • 知道结果有多少位后, 就可以试数了. 假设结果是3位, 先假设为000, 然后从头开始试100, 试110, 试111, 试112...直到得出平方数.
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner; public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String n = sc.next();
String m = sc.next();
System.out.println(sqrt(n).multiply(sqrt(m)));
} public static BigInteger sqrt(String num){
int numLen = num.length();//要开方的数字位数
int resLen = (numLen & 1) == 0 ? numLen / 2 : numLen / 2 + 1;//开方后数字的位数
char[] arr = new char[resLen];//用于尝试结果的数组
Arrays.fill(arr, '0');
BigInteger target = new BigInteger(num);
for(int pos = 0; pos < resLen; pos++){
for(char i = '1'; i <= '9'; i++){
arr[pos] = i;
BigInteger pow = new BigInteger(String.valueOf(arr)).pow(2);
if(pow.compareTo(target) == 1){
arr[pos] -= 1;
break;
}
}
}
return new BigInteger(String.valueOf(arr));
}
}

2014年第五届蓝桥杯javaB组 试题 答案 解析的更多相关文章

  1. 2016年第七届蓝桥杯javaB组 试题 答案 解析

    1.煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有多少个煤 ...

  2. 2015年第六届蓝桥杯javaB组 试题 答案 解析

    1.三角形面积 如图1所示.图中的所有小方格面积都是1. 那么,图中的三角形面积应该是多少呢? 请填写三角形的面积.不要填写任何多余内容或说明性文字. ##### 答案 : 28   ### 2.立方 ...

  3. 2013年第四届蓝桥杯javaB组 试题 答案 解析

    1.世纪末的星期 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日,如果是星期一则会.... 有趣的是,任何一个世纪末的年份的12月31日都 ...

  4. 2014年第五届蓝桥杯JavaB组省赛试题解析

    题目及解析如下: 题目大致介绍: 第一题到第三题以及第六题是结果填空,方法不限只要得到最后结果就行 第四题和第五题是代码填空题,主要考察算法基本功和编程基本功 第七题到第十题是编程题,要求编程解决问题 ...

  5. 2014年第五届蓝桥杯省赛试题(JavaA组)

    1.结果填空 (满分2分)2.结果填空 (满分6分)3.结果填空 (满分7分)4.代码填空 (满分4分)5.代码填空 (满分12分)6.结果填空 (满分12分)7.结果填空 (满分9分)8.程序设计( ...

  6. 2014年第五届蓝桥杯国赛试题(JavaA组)

    1.结果填空 (满分15分)2.结果填空 (满分45分)3.代码填空 (满分30分)4.程序设计(满分30分)5.程序设计(满分80分)6.程序设计(满分100分) 1.标题:海盗分金币 有5个海盗, ...

  7. 第五届蓝桥杯JavaB组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.武功秘籍 小明到X山洞探险,捡到一本有破损的武功秘籍(2000多页!当然是伪造的).他注意到:书的第10页和第11页在同一张纸上,但第 ...

  8. 2014年第五届蓝桥杯B组(C/C++)预赛题目及个人答案(欢迎指正)

    参考:https://blog.csdn.net/qq_30076791/article/details/50573512 第3题: #include<bits/stdc++.h> usi ...

  9. 第七届蓝桥杯javaB组真题解析-分小组(第四题)

    题目 /* 分小组 9名运动员参加比赛,需要分3组进行预赛. 有哪些分组的方案呢? 我们标记运动员为 A,B,C,... I 下面的程序列出了所有的分组方法. 该程序的正常输出为: ABC DEF G ...

随机推荐

  1. Helm学习笔记

    Helm学习笔记 Helm 是 Kubernetes 生态系统中的一个软件包管理工具.本文将介绍 Helm 中的相关概念和基本工作原理,并通过一个具体的示例学习如何使用 Helm 打包.分发.安装.升 ...

  2. 斯坦福CS224n课程作业

    斯坦福CS224n作业一 softmax 作业要求如下: 解析:题目要求我们证明\(softmax\)函数具有常数不变性. 解答:对于\(x+c\)的每一维来说,有如下等式成立: \[softmax( ...

  3. ASP.NET Core在Azure Kubernetes Service中的部署和管理

    目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cl ...

  4. .net core 中间件管道底层剖析

    .net core 管道(Pipeline)是什么? 由上图可以看出,.net core 管道是请求抵达服务器到响应结果返回的中间的一系列的处理过程,如果我们简化一下成下图来看的话,.net core ...

  5. 将AE开发的专题图制作功能发布为WPS

    AE开发可以定制化实现ArcGIS的地理处理功能,并实际运用于其他方面的工作,有时候我们还希望将AE开发的功能发布为网络地理信息处理服务(WPS),从而能在Web端更自由便利地调用所需要的地学处理算法 ...

  6. JS异步操作新体验之 async函数

    1.初识 async 函数   ES6中提供了两个很好的解决异步操作的方案 Promise 和 Generator,ES2017标准中引入的 async 函数就是建立在 Promise 和 Gener ...

  7. Docker最全教程之Python爬网实战(二十一)

    Python目前是流行度增长最快的主流编程语言,也是第二大最受开发者喜爱的语言(参考Stack Overflow 2019开发者调查报告发布).笔者建议.NET.Java开发人员可以将Python发展 ...

  8. 结合JDK源码看设计模式——模板方法模式

    前言: 相信很多人都听过一个问题:把大象关进冰箱门,需要几步? 第一,把冰箱门打开:第二,把大象放进去:第三,把冰箱门关上.我们可以看见,这个问题的答案回答的很有步骤.接下来我们介绍一种设计模式--模 ...

  9. 微信小程序计算器Bug版=-=(笔记)

    微信小程序计算器BUG版本 无APPID的测试号登录,先在app.json中更改路径,以及修改头部信息. 首先一个输入框字段用{{screenData}} 功能可以退格,清屏,正负号,正常操作加减乘除 ...

  10. ORA-39127: 调用 "WMSYS"."LT_EXPORT_PKG"."SCHEMA_INFO_EXP" 时发生意外错误

    expdp 告警提示: Export: Release 11.2.0.4.0 - Production on 星期日 4月 28 12:14:51 2019....ORA-39127: 调用 &quo ...