• 蓝桥杯2016年真题 | Java组


    1、煤球数目

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

    1. public static void main(String[] args) {
    2. int sum = 0, num = 0;
    3. for (int i = 1; i <= 100; i++){
    4. num += i;
    5. sum += num;
    6. }
    7. System.out.println (sum);
    8. }

    总结:这里看错以为是输出第100个,输出5050没过,少个sum += num; 总数每行加起来

    2、生日蜡烛

    某君从某年开始每年都举办一次生日 partyparty,并且每次都要吹熄与年龄相同根数的蜡烛。

    现在算起来,他一共吹熄了 236根蜡烛。请问,他从多少岁开始过生日 party的?

    请输出他开始过生日party的年龄数。

    1. public class Main {
    2. public static void main(String[] args) {
    3. int sum = 0;
    4. for (int i = 1; i < 50; i++) {
    5. for (int j = i; j < 50; j++) {
    6. sum += j;
    7. if (sum == 236) {
    8. System.out.println(i);
    9. return;
    10. }
    11. if (sum > 236) break;
    12. }
    13. sum = 0;
    14. }
    15. }
    16. }

    总结:用的双重循环第一个开始年龄 第二个结束年龄,然后就判断找,但是容易超时。我们当sum在某次大于236直接break,找到直接return来减少循环次数。

    3、搭积木

    小明最近喜欢搭数字积木, 一共有 10 块积木,每个积木上有一个数字,0 ~ 9。

    搭积木规则: 每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。 最后搭成 4 层的金字塔形,必须用完所有的积木。

    1. public class Main {
    2. private static int ans;
    3. private static int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    4. public static void main(String[] args) {
    5. f(0);
    6. System.out.println(ans);
    7. }
    8. private static void f(int k) {
    9. if (k == 10) {
    10. ans++;
    11. }
    12. for (int i = k; i < a.length; i++) {
    13. int t = a[i];
    14. a[i] = a[k];
    15. a[k] = t;
    16. if(k == 1 && a[1]0] ||
    17. k == 2 && a[2]0]||
    18. k == 3 && a[3]1]||
    19. k == 4 && (a[4]1]||a[4]2])||
    20. k == 5 && a[5] < a[2]||
    21. k == 6 && a[6]3]||
    22. k == 7 && (a[7]3]|| a[7]4])||
    23. k == 8 && (a[8]4]|| a[8]5])||
    24. k == 9 && a[9]5]) {
    25. t = a[i];
    26. a[i] = a[k];
    27. a[k] = t;
    28. continue;
    29. }
    30. f(k + 1);
    31. t = a[i];
    32. a[i] = a[k];
    33. a[k] = t;
    34. }
    35. }
    36. private static void check() {
    37. if (a[0] > a[1] || a[0] > a[2] || a[1] > a[3] || a[1] > a[4] || a[2] > a[4] || a[2] > a[5] || a[3] > a[6]
    38. || a[3] > a[7] || a[4] > a[7] || a[4] > a[8] || a[5] > a[8] || a[5] > a[9])
    39. return;
    40. ans++;
    41. }
    42. }

    总结:看到1到9就应该想到全排列了,基本上每年都有全排列,这个就是全排列加减枝。全排列一定要熟练默写。

    4、分小组

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

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

    1. public class Main
    2. {
    3. public static String remain(int[] a)
    4. {
    5. String s = "";
    6. for(int i=0; i
    7. if(a[i] == 0) s += (char)(i+'A');
    8. }
    9. return s;
    10. }
    11. public static void f(String s, int[] a)
    12. {
    13. for(int i=0; i
    14. if(a[i]==1) continue;
    15. a[i] = 1;
    16. for(int j=i+1; j
    17. if(a[j]==1) continue;
    18. a[j]=1;
    19. for(int k=j+1; k
    20. if(a[k]==1) continue;
    21. a[k]=1;
    22. if(k==3)
    23. System.out.println(____________________________);
    24. a[k]=0;
    25. }
    26. a[j]=0;
    27. }
    28. a[i] = 0;
    29. }
    30. }
    31. public static void main(String[] args)
    32. {
    33. int[] a = new int[9];
    34. a[0] = 1;
    35. for(int b=1; b
    36. a[b] = 1;
    37. for(int c=b+1; c
    38. a[c] = 1;
    39. String s = "A" + (char)(b+'A') + (char)(c+'A');
    40. f(s,a);
    41. a[c] = 0;
    42. }
    43. a[b] = 0;
    44. }
    45. }
    46. }

    答案:s+" "+(char)(i+'A') + (char)(j+'A')+ (char)(k+'A')+" "+remain(a)

    总结:先把填空那行注释掉,然后运行一下,发现打出500多知道是总数,然后就知道横线是输出每一行,然后下面发现传s和数组进来,然后debug发现s是abc就知道s为前3个数,退出我们这个代码是中间3个数,然后照猫画虎,最后发现remain方法没用过,idea黑色,然后发现是最后3个数,拼接上去。

    5、抽签

    X星球要派出一个 5 人组成的观察团前往 W 星。

    其中:

    A 国最多可以派出 4 人。B 国最多可以派出 2 人。C 国最多可以派出 2 人。

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

    代码填空题

    1. public class Main
    2. {
    3. public static void f(int[] a, int k, int n, String s)
    4. {
    5. if(k==a.length){
    6. if(n==0) System.out.println(s);
    7. return;
    8. }
    9. String s2 = s;
    10. for(int i=0; i<=a[k]; i++){
    11. ______________________;
    12. s2 += (char)(k+'A');
    13. }
    14. }
    15. public static void main(String[] args)
    16. {
    17. int[] a = {4,2,2,1,1,3};
    18. f(a,0,5,"");
    19. }
    20. }

    答案:f(a,k+1,n-i,s2)

    总结:我们看到当k==什么什么然后return的一般都是递归,然后又发现k一开始是0,n是5就知道,k肯定是变大,然后当大到length就return,n是5,判断可能是应该要减小,然后一直是a数组,s2没有用到,所有大概猜测出答案。这种递归要搞清楚每个参数的含义和变化方向

    6、寒假作业

    一看就是全排列

    1. public class Main {
    2. static int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13};
    3. static int count;
    4. public static void main(String[] args) {
    5. f(0);
    6. System.out.print(count);
    7. }
    8. public static void f(int k){
    9. if(k==13){
    10. if(check())count++;
    11. }
    12. for(int i=k;i<13;i++){
    13. int t=a[k];a[k]=a[i];a[i]=t;
    14. if(k==2&&a[0]+a[1]!=a[2] ||
    15. k==5&&a[3]-a[4]!=a[5]){
    16. t=a[k];a[k]=a[i];a[i]=t;
    17. continue;
    18. }
    19. f(k+1);
    20. t=a[k];a[k]=a[i];a[i]=t;
    21. }
    22. }
    23. public static boolean check(){
    24. if(a[0]+a[1]==a[2] &&
    25. a[3]-a[4]==a[5] &&
    26. a[6]*a[7]==a[8] &&
    27. a[9]%a[10]==0 &&
    28. a[9]/a[10]==a[11]){
    29. return true;
    30. }
    31. return false;
    32. }
    33. }

    总结:全排列模板必须熟练默写,这个第一次交换进递归的时候可以进行减枝,跟上面题3一样。没什么好说,交换递归交换回去,然后达到if条件就根据题目来check()

    7、凑算式

    1. public class test {
    2. static int a[]= {1,2,3,4,5,6,7,8,9};
    3. static int count;
    4. public static void main(String[] args) {
    5. f(0);
    6. System.out.print(count);
    7. }
    8. public static void f(int k) {
    9. if(k==9) {
    10. if(check()) {
    11. count++;
    12. }
    13. }
    14. for(int i=k;i<9;i++) {
    15. int t=a[i];a[i]=a[k];a[k]=t;
    16. f(k+1);
    17. t=a[i];a[i]=a[k];a[k]=t;
    18. }
    19. }
    20. public static boolean check() {
    21. int num1 = a[3]*100+a[4]*10+a[5];
    22. int num2 = a[6]*100+a[7]*10+a[8];
    23. int num3 = a[1]*num2+a[2]*num1;
    24. int num4 = a[2]*num2;
    25. if(num3%num4 != 0)return false;
    26. if(a[0]+num3/num4 == 10)return true;
    27. return false;
    28. }
    29. }

    总结:又是全排列,但是这里有坑,可能除不尽这里必须通分一下,才能除尽。 

    8、方格填数

    1. import java.util.Scanner;
    2. import static java.lang.Math.abs;
    3. // 1:无需package
    4. // 2: 类名必须Main, 不可修改
    5. public class Main {
    6. static int[] a={0,1,2,3,4,5,6,7,8,9};
    7. static int ans=0;
    8. public static void main(String[] args) {
    9. f(0);
    10. System.out.println(ans);
    11. }
    12. private static void f(int k) {
    13. if (k==10){
    14. if (check())
    15. ans++;
    16. return;
    17. }
    18. for (int i=k;i<10;i++){
    19. int t=a[i];
    20. a[i]=a[k];
    21. a[k]=t;
    22. f(k+1);
    23. t=a[i];
    24. a[i]=a[k];
    25. a[k]=t;
    26. }
    27. }
    28. private static boolean check() {
    29. if ( abs(a[0]-a[1])==1||
    30. abs(a[0]-a[3])==1||
    31. abs(a[0]-a[4])==1||
    32. abs(a[0]-a[5])==1||
    33. abs(a[1]-a[2])==1||
    34. abs(a[1]-a[4])==1||
    35. abs(a[1]-a[5])==1||
    36. abs(a[1]-a[6])==1||
    37. abs(a[2]-a[5])==1||
    38. abs(a[2]-a[6])==1||
    39. abs(a[3]-a[4])==1||
    40. abs(a[3]-a[7])==1||
    41. abs(a[3]-a[8])==1||
    42. abs(a[4]-a[5])==1||
    43. abs(a[4]-a[7])==1||
    44. abs(a[4]-a[8])==1||
    45. abs(a[4]-a[9])==1||
    46. abs(a[5]-a[6])==1||
    47. abs(a[5]-a[8])==1||
    48. abs(a[5]-a[9])==1||
    49. abs(a[6]-a[9])==1||
    50. abs(a[7]-a[8])==1||
    51. abs(a[8]-a[9])==1){
    52. return false;
    53. }
    54. return true;
    55. }
    56. }

    总结:还是全排列,但是这次的check是个体力活,用到 abs(a-b) 是不会的,绝对值,学习一下

    9、四平方和

    1. import java.awt.*;
    2. import java.util.Scanner;
    3. public class Main {
    4. public static void main(String args[]) {
    5. Scanner in = new Scanner(System.in);
    6. int n=in.nextInt();
    7. int m=(int)Math.sqrt(n);
    8. for (int i = 0; i <= m; i++) {
    9. for (int j = i; j <= m; j++) {
    10. for (int k = j; k <= m; k++) {
    11. for (int l = k; l <=m ; l++) {
    12. if (i*i+j*j+k*k+l*l==n){
    13. System.out.println(i+" "+j+" "+k+" "+l);
    14. return;
    15. }
    16. }
    17. }
    18. }
    19. }
    20. }
    21. }

    总结:就是暴力枚举4个数字,但是直接暴力超时,我们要优化,后面的数是从前面的数开始循环,所有数都不大于输入的开根号。int m=(int)Math.sqrt(n);

    10、有奖猜谜

    小明很喜欢猜谜语。 最近,他被邀请参加了 X 星球的猜谜活动。

    每位选手开始的时候都被发给 777777 个电子币。 规则是:猜对了,手里的电子币数目翻倍, 猜错了,扣除 555555 个电子币, 扣完为止。

    小明一共猜了 1515 条谜语。 战果为:vxvxvxvxvxvxvvxvxvxvxvxvxvxvvx 其中 vv 表示猜对了,xx 表示猜错了。

    请你计算一下,小明最后手里的电子币数目是多少。

    1. public class Main {
    2. public static void main(String[] args) {
    3. String string = new String();
    4. string="vxvxvxvxvxvxvvx";
    5. int coin=777;
    6. for (int i = 0; i < 15; i++) {
    7. if(string.charAt(i)=='v'){
    8. coin*=2;
    9. }
    10. else if (string.charAt(i)=='x'){
    11. coin-=555;
    12. }
    13. if (coin==0){
    14. System.out.println("game over"+i);
    15. }
    16. }
    17. System.out.println(coin);
    18. }
    19. }

    总结:送分题,我用了数组的形式,要学会用String,能直接从题目复制,节省时间string.charAt(i)=='v'

    11、骰子游戏

    同时掷出 3 个普通骰子(6 个面上的数字分别是 1~6)。 如果其中一个骰子上的数字等于另外两个的和,你就赢了。

    下面的程序计算出你能获胜的精确概率(以既约分数表示) 填空

    1. import java.util.*;
    2. public class Main
    3. {
    4. public static int gcd(int a, int b)
    5. {
    6. if(b==0) return a;
    7. return gcd(b,a%b);
    8. }
    9. public static void main(String[] args)
    10. {
    11. int n = 0;
    12. for(int i=0; i<6; i++)
    13. for(int j=0; j<6; j++)
    14. for(int k=0; k<6; k++){
    15. if(________________________________) n++;
    16. }
    17. int m = gcd(n,6*6*6);
    18. System.out.println(n/m + "/" + 6*6*6/m);
    19. }
    20. }

    答案:(i+j+1==k) || (i+k+1==j) || (j+k+1==i)

    总结:这题有坑,下标是从下标为0开始的,我们的骰子是从1到6,所以必须加1,我题目也看错了,一开始看题看错以为两个骰子相等就赢。

  • 相关阅读:
    Centos7 系统开通后修改数据盘挂载目录
    它来了,Nacos 2.1.1 正式发布
    软件测试-BUG
    基于IGT-DSER智能网关实现GE的PAC/PLC与罗克韦尔(AB)的PLC之间通讯
    讯飞大数据竞赛2022 汽车领域多语种迁移学习 打卡博客
    数商云供应链管理系统助力化工行业企业实现客户订单管理可视化
    qt中qstring合并字符串
    C和指针 第11章 动态内存分配 11.4 使用动态分配的内存
    Scanner类中nextInt()和nextLine()一起使用时出现的问题
    数据库-sqlserver数据库迁移到mysql
  • 原文地址:https://blog.csdn.net/weixin_54232666/article/details/127727658