2016年第七届蓝桥杯Java-B(水了一把)

2016年第七届蓝桥杯Java-B(水了一把)


题解

1.煤球数目

有一堆煤球,堆成三角棱锥形。具体:

第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
….

如果一共有100层,共有多少个煤球?

请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

找规律,水题一道
思路:
1 3 6 10
+1 +2 +3 +4

    public static void main(String[] args) {
        int sum = 1;
        int l = 1;
        for(int i=2; i<=100; i++){
            l += i;
            sum += l;
        }
        System.out.println(sum);
    }

结果:171700


2.生日蜡烛

某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。
现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的?
请填写他开始过生日party的年龄数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

简单的数学问题,不用电脑了,手动AC

用到一些数学知识:
奇数加偶数为奇数
一奇一偶相加为奇数
二奇二偶相加为偶数

思路:
1.236是偶数,则他必定过了偶数个生日且年龄为奇数,而过年龄为偶数的生日次数不确定。
2.假设:过年龄为偶数的生日次数为奇数,则过生日次数可能为3、5、7、9、11、13、15。由于15^2<236<16^2,当过15次生日时,最小的那一年年龄是大于1的,但16岁就不行了。
3.用236以此除以可能的数,没有一个结果是整数的,故:过了偶数年龄生日的次数为偶数。
4.那就依次除以2、4、6、8、10、12、14,找出结果为0.5的,236/8=29.5
5.试试,26+27+……+33=236

3.凑算式

这里写图片描述

这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

思路:
直接暴搜,不过,由于A是整数,可以不循环A,而是在枚举出B~I后,判断A是否为整数。

public static void main(String[] args) {
    int a,b,c,d,e,f,g,h,i,count=0;  
    for(a=1;a<=9;a++)   
        for(b=1;b<=9;b++)   
            for(c=1;c<=9;c++)   
                for(d=1;d<=9;d++)   
                    for(e=1;e<=9;e++)   
                        for(f=1;f<=9;f++)   
                            for(g=1;g<=9;g++)   
                                for(h=1;h<=9;h++)   
                                    for(i=1;i<=9;i++)   
                                    {  
                                        if(a!=b&&a!=c&&a!=d&&a!=e&&a!=f&&a!=g&&a!=h&&a!=i&&b!=c&&b!=d&&b!=e&&b!=f&&b!=g&&b!=h&&b!=i&&c!=d&&c!=e&&c!=f&&c!=g&&c!=h&&c!=i&&d!=e&&d!=f&&d!=g&&d!=h&&d!=i&&e!=f&&e!=g&&e!=h&&e!=i&&f!=g&&f!=h&&f!=i&&g!=h&&g!=i&&h!=i&&(a+b*1.0/c+(d*100+e*10+f)*1.0/(g*100+h*10+i)==10))  
                                            count++;  
                                    } 
    System.out.println(count);
}

结果是:29

4.分小组

9名运动员参加比赛,需要分3组进行预赛。
有哪些分组的方案呢?

我们标记运动员为 A,B,C,… I
下面的程序列出了所有的分组方法。

该程序的正常输出为:
ABC DEF GHI
ABC DEG FHI
ABC DEH FGI
ABC DEI FGH
….. (以下省略,总共560行)。

public class A{
public static String remain(int[] a)
{
    String s = "";
    for(int i=0; i<a.length; i++){
        if(a[i] == 0) s += (char)(i+'A');
    } 
    return s;
}

public static void f(String s, int[] a)
{
    for(int i=0; i<a.length; i++){
        if(a[i]==1) continue;
        a[i] = 1;
        for(int j=i+1; j<a.length; j++){
            if(a[j]==1) continue;
            a[j]=1;
            for(int k=j+1; k<a.length; k++){
                if(a[k]==1) continue;
                a[k]=1;
                System.out.println(__________________________________); //填空位置
                a[k]=0;
            }
            a[j]=0;
        }
        a[i] = 0;
    }
}

public static void main(String[] args)
{
    int[] a = new int[9]; 
    a[0] = 1;

    for(int b=1; b<a.length; b++){
        a[b] = 1;
        for(int c=b+1; c<a.length; c++){
            a[c] = 1;
            String s = "A" + (char)(b+'A') + (char)(c+'A');
            f(s,a);
            a[c] = 0;
        }
        a[b] = 0;
    }
}}


这种代码填空题,正确答案肯定跟需填空处周围的变量有关,所以,看完代码后,直接开debug吧。
然而我参赛用的电脑的eclipse版本较低,debug的单步调试功能在进入递归的时候,存在一次性执行到程序结束的情况(我学校的电脑就这样子,没有debug,后面的答题就只能靠人品了)苦逼的只好手动插桩调试了。
结果:
s+" "+(char)(i+'A')+(char)(j+'A')+(char)(k+'A')+" "+remain(a)

5.抽签

X星球要派出一个5人组成的观察团前往W星。
其中:
A国最多可以派出4人。
B国最多可以派出2人。
C国最多可以派出2人。
….

那么最终派往W星的观察团会有多少种国别的不同组合呢?

下面的程序解决了这个问题。
数组a[] 中既是每个国家可以派出的最多的名额。
程序执行结果为:

DEFFF
CEFFF
CDFFF
….
(以下省略,总共101行)

public class A{
public static void f(int[] a, int k, int n, String s)
{
    if(k==a.length){ 
        if(n==0) System.out.println(s);
        return;
    }

    String s2 = s;
    for(int i=0; i<=a[k]; i++){
        _____________________________; //填空位置
        s2 += (char)(k+'A');
    }
}

public static void main(String[] args)
{
    int[] a = {4,2,2,1,1,3};

    f(a,0,5,"");
}
}


结果:f(a,k+1,5-s2.length(),s2)

6.方格填数

如下的10个格子
这里写图片描述

填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

好吧,这题不会,找到一个会的:
http://blog.csdn.net/u014552756/article/details/50946108

7.剪邮票

这里写图片描述
这里写图片描述
这里写图片描述
如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。

请你计算,一共有多少种不同的剪取方法。

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

我能说这道题我是手动AC的吗?
以前玩过奥数,写过不少这样数方格的题
这里写图片描述

DFS,这个我不会,不过有人会
http://blog.csdn.net/u014552756/article/details/50946197

8.四平方和

四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多4个正整数的平方和。
如果把0包括进去,就正好可以表示为4个数的平方和。

比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
(^符号表示乘方的意思)

对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对4个数排序:
0 <= a <= b <= c <= d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法

程序输入为一个正整数N (N<5000000)
要求输出4个非负整数,按从小到大排序,中间用空格分开

例如,输入:
5
则程序应该输出:
0 0 1 2

再例如,输入:
12
则程序应该输出:
0 2 2 2

再例如,输入:
773535
则程序应该输出:
1 1 267 838

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

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

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

简单,穷举。

import java.util.*;
public class Main{
    static Scanner in = new Scanner(System.in);

    static void fun()
    {
        int n=in.nextInt();
        int limit=(int)Math.sqrt(n);
        for(int x=0;x<=limit;x++)
            for(int y=x;y<=limit;y++)
                for(int z=y;z<=limit;z++)
                {
                    int w=(int)Math.sqrt(n-x*x-y*y-z*z);
                    if(w*w+x*x+y*y+z*z==n)
                    {
                        System.out.println(x+" "+y+" "+z+" "+w);
                        return ;
                    }
                }
    }
    public static void main(String[] args){
        fun();
    }
}

感觉要超时

9.取球博弈

两个人玩取球的游戏。
一共有N个球,每人轮流取球,每次可取集合{n1,n2,n3}中的任何一个数目。
如果无法继续取球,则游戏结束。
此时,持有奇数个球的一方获胜。
如果两人都是奇数,则为平局。

假设双方都采用最聪明的取法,
第一个取球的人一定能赢吗?
试编程解决这个问题。

输入格式:
第一行3个正整数n1 n2 n3,空格分开,表示每次可取的数目 (0

10.压缩变换

小明最近在研究压缩算法。
他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比。
然而,要使数值很小是一个挑战。

最近,小明需要压缩一些正整数的序列,这些序列的特点是,后面出现的数字很大可能是刚出现过不久的数字。对于这种特殊的序列,小明准备对序列做一个变换来减小数字的值。

变换的过程如下:
从左到右枚举序列,每枚举到一个数字,如果这个数字没有出现过,刚将数字变换成它的相反数,如果数字出现过,则看它在原序列中最后的一次出现后面(且在当前数前面)出现了几种数字,用这个种类数替换原来的数字。

比如,序列(a1, a2, a3, a4, a5)=(1, 2, 2, 1, 2)在变换过程为:
a1: 1未出现过,所以a1变为-1;
a2: 2未出现过,所以a2变为-2;
a3: 2出现过,最后一次为原序列的a2,在a2后、a3前有0种数字,所以a3变为0;
a4: 1出现过,最后一次为原序列的a1,在a1后、a4前有1种数字,所以a4变为1;
a5: 2出现过,最后一次为原序列的a3,在a3后、a5前有1种数字,所以a5变为1。
现在,给出原序列,请问,按这种变换规则变换后的序列是什么。

输入格式:
输入第一行包含一个整数n,表示序列的长度。
第二行包含n个正整数,表示输入序列。

输出格式:
输出一行,包含n个数,表示变换后的序列。

例如,输入:
5
1 2 2 1 2

程序应该输出:
-1 -2 0 1 1

再例如,输入:
12
1 1 2 3 2 3 1 2 2 2 3 1

程序应该输出:
-1 0 -2 -3 1 1 2 2 0 0 2 2

数据规模与约定
对于30%的数据,n<=1000;
对于50%的数据,n<=30000;
对于100%的数据,1 <=n<=100000,1<=ai<=10^9

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

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

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

没时间了,没写。离开机房后,也不想再写了。

各题分数

(1)3 (2)5 (3)9 (4)11 (5)13 (6)15 (7)19 (8)21 (9)23 (10)31

C/C++组传送门

http://blog.csdn.net/u014552756/article/details/50946357

感悟

蓝桥杯这个程序设计比赛,除了需要提交完整代码的题外,还有一些填空,有些题可以不用编程来解决,这与ACM相比,难度降低了不少,而且设置的得奖人数很多很多很多很多。很适合用来刷荣誉证书(我学校对着方面有要求),然而我们不能就此止步。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值