八十二、Java算法练习打卡(三题)

举报
托马斯-酷涛 发表于 2022/05/25 23:31:40 2022/05/25
【摘要】 文章目录 题目一 题目描述 运行限制 题解 题目二 题目描述 运行限制 题解 题目三 题目描述 输入描述 输出描述 输入样例 输出样例 运行限制 题解   题目一 题目描述 年龄巧合 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即...

文章目录

题目一

题目描述

运行限制

题解

题目二

题目描述

运行限制

题解

题目三

题目描述

输入描述

输出描述

输入样例

输出样例

运行限制

题解


 

题目一

题目描述

年龄巧合

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小明和他的表弟一起去看电影,有人问他们的年龄。小明说:今年是我们的幸运年啊。我出生年份的四位数字加起来刚好是我的年龄。表弟的也是如此。已知今年是 2014 年,并且,小明说的年龄指的是周岁。

请推断并填写出小明的出生年份。


运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

题解


  
  1. public class Main {
  2. public static void main(String[] args) {
  3. for (int i = 2014; i > 1950; i--) {
  4. if ((2014 - i) == (i % 10 + (i / 10) % 10 + (i / 100) % 10 + (i / 1000) % 10))
  5. System.out.println(i);
  6. }
  7. }
  8. }

注:确定区间(1950,2014),结果为2006,1988,他是我表弟,故为2006年出生

答案:    我 :1988  他 :2006

题目二

题目描述

纸牌三角形

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

A,2,3,4,5,6,7,8,9共 9 张纸牌排成一个正三角形(A 按 1 计算)。要求每个边的和相等。 下图就是一种排法。

 

这样的排法可能会有很多。

如果考虑旋转、镜像(对称)后相同的算同一种,一共有多少种不同的排法呢?

请你计算并提交该数字。


运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

题解


  
  1. public class Main {
  2. static int ans = 0;
  3. static int[] A = new int[9];// 用来存数据
  4. static int[] B = new int[9];// 用来表示该数组的位置是否有被遍历过
  5. public static void main(String[] args) {
  6. dfs(0);
  7. // 因为旋转和镜像代表的是同一种,但是它们各重复三次,即重复六次,所以最后要除以六
  8. System.out.println(ans / 6);
  9. }
  10. public static void dfs(int num) {
  11. if (num == 9 && ((A[0] + A[1] + A[2] + A[3]) == (A[3] + A[4] + A[5] + A[6]))
  12. && ((A[3] + A[4] + A[5] + A[6]) == (A[6] + A[7] + A[8] + A[0]))) {
  13. ans++;
  14. return;
  15. }
  16. for (int i = 0; i < 9; i++) {
  17. if (B[i] == 0) {
  18. A[num] = i + 1;// 对数组进行赋值
  19. B[i] = 1;// 表示该位置已经赋值
  20. dfs(num + 1);
  21. B[i] = 0;// 回溯
  22. }
  23. }
  24. }
  25. }

注:dfs搜索,全排列,抓住三个要素最为关键

  • 入口的参数设置
  • dfs的出口设置
  • 是否需要回溯

答案:144

题目三

题目描述

取球游戏

今盒子里有 n个小球,A、B 两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。

我们约定:

每个人从盒子中取出的球的数目必须是:1,3,7 或者 8 个。轮到某一方取球时不能弃权!A 先取球,然后双方交替取球,直到取完。被迫拿到最后一个球的一方为负方(输方)

请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A 是否能赢?


输入描述

先是一个整数 n (n<100),表示接下来有 n 个整数。

然后是 n个整数,每个占一行(整数< 10^4),表示初始球数。

输出描述

程序则输出 n 行,表示 A 的输赢情况(输为 0,赢为 1)。

输入样例


   
  1. 4
  2. 1
  3. 2
  4. 10
  5. 18

输出样例


   
  1. 0
  2. 1
  3. 1
  4. 0

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

题解

(暴力求解)


  
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Scanner;
  4. //类似于爬楼梯的递归模式
  5. public class Main {
  6. public static void main(String[] args) {
  7. Scanner scanner = new Scanner(System.in);
  8. int n = scanner.nextInt();
  9. List<Integer> l = new ArrayList<>();
  10. for (int i = 0; i < n; i++) {
  11. l.add(scanner.nextInt());
  12. }
  13. for (int j = 0; j < n; j++) {
  14. if (A(l.get(j))) {
  15. System.out.println(1);
  16. } else {
  17. System.out.println(0);
  18. }
  19. }
  20. }
  21. public static boolean A(int m) {
  22. if (m >= 1) {
  23. switch (m) {
  24. case 1:
  25. return false;// 当你要去拿球时,并且最后只剩下1个球时,输
  26. case 3:
  27. return false;// 当你要去拿球时,并且最后只剩下3个球时,输
  28. case 7:
  29. return false;// 输
  30. case 8:
  31. return true;// 赢
  32. default:
  33. return (!A(m - 1) || !A(m - 3) || !A(m - 7) || !A(m - 8));// 这个时候表示自己拿1或3或7或8个球,然后这时对象变成了对面的一个人,所以要加!
  34. }
  35. }
  36. return false;
  37. }
  38. }

(dp求解)


  
  1. import java.util.Scanner;
  2. //dp解法
  3. public class Main {
  4. public static void main(String[] args) {
  5. Scanner scanner = new Scanner(System.in);
  6. int n = scanner.nextInt();
  7. boolean[] A = new boolean[10009];// 因为n<10^4
  8. A[0] = true;
  9. for (int i = 1; i < 10009; i++) {
  10. A[i] = (!(A[i - 1]) || (i >= 3 && !A[i - 3]) || (i >= 7 && !A[i - 7]) || (i >= 8 && !A[i - 8]));// 这个时候表示自己拿1或3或7或8个球,然后这时对象变成了对面的一个人,所以要加!
  11. }
  12. // 为了方便输出
  13. int[] B = new int[n + 1];
  14. for (int i = 1; i <= n; i++) {
  15. int j = scanner.nextInt();
  16. if (!A[j]) {
  17. B[i] = 0;
  18. } else {
  19. B[i] = 1;
  20. }
  21. }
  22. for (int k = 1; k <= n; k++) {
  23. System.out.println(B[k]);
  24. }
  25. }
  26. }

暴力求解:代码冗余,重复率较高,显得笨重且繁琐

dp求解:结果只有两种 ,他赢或我赢,是非的关系,用“||”来选择四种取法,表示只要有一种取法能够赢,那我最后就是赢的,取法都是最优值。

eg:4个球

1,1,1,1(我输了)

3,1(我赢了)

遍历计算结果,进行累计


 

文章来源: tuomasi.blog.csdn.net,作者:托马斯-酷涛,版权归原作者所有,如需转载,请联系作者。

原文链接:tuomasi.blog.csdn.net/article/details/123565978

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。