华为机试4.20:新员工考试

复盘一下之前的笔试做的题目,这是第一题,100分的题目。考的回溯,当时也没做出来。

1.新员工考试

小聪入职新公司,参加线上的新员工必备考试,考试共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道单选题答错,其余的题目都答对,所有可能的答题情况的个数为100。

样例2

输入:

100

输出:

1

解释:

所有题目全部答对,答错情况的个数为1。

思路:

回溯,进行模拟来枚举所有的情况,设置一个函数dfs(),order表示当前答的题号,初始化得分为0,对于每个题目,都有答对或者答错两种可能,依次进行判断。到指定的分数就对情况数+1。

附上Java代码实现:

import java.util.*;

public class Solution1 {
    public static int res = 0;

    public static void dfs(int sumScore,int order, int wrongNum,int target){
        //回溯所有情况
        if(sumScore==target){
            res++;
            return;
        }
        //答错三道或者答完所有题目,退出
        if(wrongNum>=3 || order>25){
            return;
        }

        //判断题
        if(order<=10){
            //此题答对
            dfs(sumScore+2,order+1,wrongNum,target);
            //此题答错
            dfs(sumScore,order+1,wrongNum+1,target);
        //单选题
        }else if(order<=20){
            //此题答对
            dfs(sumScore+4,order+1,wrongNum,target);
            //此题答错
            dfs(sumScore,order+1,wrongNum+1,target);
        }
        //多选题
        else {
            //此题答对
            dfs(sumScore+8,order+1,wrongNum,target);
            //此题答错
            dfs(sumScore,order+1,wrongNum+1,target);
        }
    }


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int target = sc.nextInt();
        //从第一题开始答
        dfs(0,1,0,target);
        System.out.println(res);
    }
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值