严正声明:转载请注明出处!!!

总结一下做题的过程:
刚开始以为第一题很简单,因为忽略了一个很重要的条件,再去读题发现没注意到那个要点,然后开始重来,发现下不了笔,整个人都傻了。整个一大惨败,前一个小时根本没思路,一个小时后发现可以分情况考虑,但是当时又遇到了一个问题,就是不知道怎么去分是否要退出的情况。做完第一题剩下10几分钟,直接交卷了,麻了……
第二题没怎么看,感觉是这三题里面最难的。
最后一道题感觉用回溯可以做,但是我由于时间剩得不多了,当时比较慌,找不到递归出口的条件,下来跟他们讨论了一下这个题,说是要么需要遍历一遍,要么就是建树,但是我觉得这题可以直接看作是没有回路的图。但是呢,想到他们说2022.4.13那次的最后一题用回溯做完过了5%,原因是超时,就心态崩了,还是果断放弃,直接System.out.println(-1);过了10%,溜了溜了……

题目描述:小聪入职新公司,参加线上的新员工必备考试,考试共25题,依次是10个判断题(每题2分)、10个单选题(每题4分)和5个多选题(每题8分),总分100分。
考题只能顺序作答,答对题目获得相应的分数,答错题目获得0分,考试系统不提示作答是否正确,答题过程中如果累积有3道题答错,直接中止考试并计算考试分数。
小聪考试结果是N分(0<=N<=100),请根据小聪的分数,算出所有可能的答题情况的个数。
输入

整数,表示小聪的考试得分N,N为偶数,0<=N<=100(N不会是不可能考出来的分数)。

输出

整数,表示所有可能的答题情况的个数

样例1

输入:94
输出:100
解释:有1道判断题和1道单选题答错,其余的题都答对

样例2

输入:100
输出:1
解释:所有的都答对

思路
三种情况:

  1. 如果分数N <= 18的话只能是全是判断题
  2. 如果分数N在20到58之间可以是判断+单选
  3. 如果分数N >= 60可以是判断+单选+多选

比如:

  • 16的时候只能是8个判断,18的时候只能是9个判断
  • 20的时候可以是 10判或者8判+1单,22的时候是9判+2单
  • 56的时候可以是8判+10单,58的时候可以是9判+10单
  • 60的时候可以是10判+10单或者10判+8单+1多,62的时候是9判+9单+1多
    找到这几个边界的数据,就可以推断出上面的三个区间。

设判断题个数为x,单选个数为y,多选个数为z

  1. 如果全是判断题,那2x = N, x = N / 2
  2. 如果判断题+单选题,那就是2x + 4y = N,x可以是8,9,10,y = (N - 2x) / 4
  3. 如果是判断+单选+多选,那就2x+4y+8z = N

x可以是8,9,10
当x = 8时,y只能是10
当x = 9时,y可以是9,10
当x = 10时,y可以是8,9,10
z = (N - 2x - 4y) / 8

比如:情况3 且x = 9时,判断错了一道,单选只能错1道或者0道,如果单选错了2道的话,就直接结束了,就没有答对的多选题了。这种是属于第2种情况,判断题对9道,单选对8道,总分是9 * 2 + 8 * 4 = 50
综上可以根据N计算出x,y,z。
然后根据x,y,z计算可能的答题组合。

第一种情况:2x = N
当x 为8,9,10的时候,即最多错2道,就是10道题中选择x道题,结果就是组合数C(10, x)
如果x < 8,这种情况要注意,不能是C(10, x),比如x=2时,最多只能做到第4题,第五题肯定是错的,如果第五题是对的,那至少也对了3道题。所以结果应该是C(x + 2, x)。此注意的点对下面的两种情况都满足。

第二种情况:2x + 4y = N
当x为8时,计算出y,如果y不是整数,那这个组合无效。如果y为整数,就符合条件,比如56分时x = 8,y = 10
那结果就是C(10, x) * C(10, y),这里计算C时跟上一步说的一样,要考虑中途结束答题的情况。
此时又有个注意的点,比如当x = 8时,y = 5时,y只能是单选题的前5个,因为判断题已经错了两个了,如果单选题前5个中间再错一个就结束答题了,所以就算y的组合数的时候,应该是C(y, y) = 1,而不是C(y + 2, y)。结果是C(10, x) * C(y, y)。
再比如当x = 9时,y = 5的话,单选题的前5个里只能错1个,组合数就是C(y + 1, y),结果是C(10, x) * C(y + 1, y)
然后把x的三种情况的结果相加就是最后的结果。

第三种情况和第二种类似,只是计算z的时候要先根据x把y的范围找出来,再把y的可能列出来,再去计算z。
下面截图框出来的部分就是处理上面说的注意的点。

代码

import java.util.*;
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();int count = 0;if(N <= 18){int x = N / 2;int y = 0;int z = 0;count = count(x, y, z);}else if(20 <= N && N <= 58){int[] xArr = {8, 9, 10};for(int x: xArr){int r = (N - 2 * x) % 4;if(r != 0){continue;}int y = (N - 2 * x) / 4;count += count(x, y, 0);}}else if(60 <= N){int[] xArr = {8, 9, 10};for(int x: xArr){int[] yArr = {10};if(x == 9){yArr = new int[]{9, 10};}if(x == 10){yArr = new int[]{8, 9, 10};}for(int y: yArr){int r = (N - 2 * x - 4 * y) % 8;if(r != 0){continue;}int z = (N - 2 * x - 4 * y) / 8;count += count(x, y, z);}}}System.out.println(count);}public static int count(int x, int y, int z){int m1 = x + 2;if(m1 > 10){m1 = 10;}int m2 = y + (2 - (10 - x));if(m2 > 10){m2 = 10;}int m3 = z + (2 - (10 - x) - (10 - y));if(m3 > 5){m3 = 5;}int c1 = c(m1, x);int c2 = c(m2, y);int c3 = c(m3, z);return c1 * c2 * c3;}public static int c(int m, int n){int sum1 = 1;for(int i = 1;i <= n;i++){sum1 = sum1 * i;}int sum2 = 1;for(int j = m;j >= m - n + 1;j--){sum2 = sum2 * j;}return sum2 / sum1;}
}

期待有更好思路的你们提供更优的方法。

2022.04.20华为笔试相关推荐

  1. 2022.9.7华为笔试

    第一题: public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner ...

  2. 2022校招:华为笔试

    三题120分钟,分值=100+200+300.需要自己处理输入. 华为是谁? 华为是全球领先的信息与通信技术( ICT)解决方案供应商,专注于 ICT 领域,坚持稳 健经营.持续创新.开放合作,在电信 ...

  3. 大厂真题|蚂蚁春招.04.04研发岗笔试模拟赛

    2023大厂真题提交网站(含题解) www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度.现已录 ...

  4. 2022/7/26华为机试,Q2,上机迷迷糊糊的,搞完突然醒悟,自抱自泣!三道题附带答案

    21:52 2022/7/26华为机试三道题附带答案 备注:未ac,华为不难,难的是个人很难进入答题状态! 第一道 给定一个字符串,是工作记录的日志时间,时间为四段格式,AA:BB:CC:DDD 其中 ...

  5. 2019/04/12 华为通用软件开发工程师现场面试(offer到手)

    2019/04/12 华为通用软件开发工程师现场面试(offer到手) 时间轴 三月中旬做的笔试 3题ac两道 4/8 性格测试 4/12 现场面试 地点是 广州某家酒店,近地铁站的,中大过去也是要一 ...

  6. 华为 社招 C语言笔试,华为笔试C语言笔试题之3

    <华为笔试C语言笔试题之3>由会员分享,可在线阅读,更多相关<华为笔试C语言笔试题之3(10页珍藏版)>请在人人文库网上搜索. 1.C 语言笔试题之34. static 有什么 ...

  7. 从无到有 Ubuntu16.04 18.04 20.04安装+Todesk+Chrome+NVIDIA驱动+CUDA+Cudnn+Anaconda3+Pycharm 超详细教程+踩坑问题

    从无到有 Ubuntu16.04 18.04 20.04安装+Todesk+Chrome+NVIDIA驱动+CUDA+Cudnn+Anaconda3+Pycharm 超详细教程+踩坑问题(有部分图片忘 ...

  8. 旅行商问题(华为笔试蜜蜂采蜜问题)

    旅行商问题是算法中比较难的一类题目,也是比较综合的题目之一,其变种的题目也非常灵活,应用场景非常广泛,前段时间在做华为笔试题目的时候,遇到了一个与旅行商问题相关的蜜蜂飞行采花粉问题: 题目大意是:一个 ...

  9. 【转载】旅行商问题(华为笔试蜜蜂采蜜问题)

    本文转载链接: https://blog.csdn.net/qq_29592167/article/details/90243408 感谢来自Raintin_coder的分享 旅行商问题是算法中比较难 ...

最新文章

  1. 模拟spring - 简单实现spring IOC
  2. uboot中添加新型号步骤以及编译方法
  3. socket编程之select()
  4. 从 bug 中学习:六大开源项目告诉你 go 并发编程的那些坑
  5. 系统升级后找不到网络计算机,Windows10系统局域网中共享计算机找不到怎么办
  6. matlab find
  7. java保留二位小数_java使double保留两位小数的多方法 java保留两位小数
  8. Python基础语法学习整理
  9. 「递归」的正确打开方式,看不懂你打我~
  10. jQuery获取select onChange的值
  11. Java多线程(六)——多线程的阻塞队列
  12. window.location.reload(false);window.location.reload(true);history.Go(0)区别
  13. Java input char_java.util.regex.Pattern.matcher(CharSequence input)方法
  14. 小程序内嵌的H5页面如何跳转到其他小程序?
  15. MATLAB变压器设备故障模型,电力变压器内部故障简便仿真模型
  16. ofo押金未退仍在自动续费上热搜,曾经的明星公司是怎么黄的?
  17. 计算机word知识试题及答案,全国计算机等级考试Word试题及答案(2)
  18. 计算机组成原理知识点2
  19. 幻灯片无缝滑动(无需重新设置下标)
  20. C++ 坑人小程序(全集)

热门文章

  1. 武林外传寻路call
  2. python基础----Conda环境管理、yml依赖安装python环境、pip依赖安装python环境
  3. java版Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o商城之移动商城金刚区管理
  4. Linux-Centos7源码编译安装Twemproxy服务
  5. AI作诗:深度学习应用演示平台
  6. spring是如何实现声明式事务的
  7. (Training 1) Educational Codeforces Round 101
  8. NVIDA-TensorRT部署(一)
  9. 产业链金风控基本逻辑
  10. 小鱼儿yr系统封装优化设置辅助工具V2.05.3