2022华为机试4.20号 第一题

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

样例1
输入:94
输出:100
解释:1道判断题和1道单选题答错,其余的题都答对,所有可能的答题情况的个数为100;
样例2
输入:100
输出:1
解程:所有题目全部答对,答题情况的个致为1
package 面试题.华为;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

//1、新员工考试
//小聪入职新公司,参加线上的新员工必备考试,考试共25题,依次是10个判断题(每题2分)、10个单选题(每题4分)和5个多选题(每题8分),总分100分;
//考题只能顺序作答,答对题目获得相应的分数。答错题目获得0分,考试系统不提示作答是否正确,答题过程中如果累积有3题答错,直接中止考试并计算考试分数。
//小聪考试结果是N分,请根据小聪的分数,算出所有可能的答题情况的个数。输入一个整数,表示小聪的考试得分N,N为偶数,0<=N<=100(N不会是不可能考出来的分数)。
//输出一个整数表示所有可能的答题情况的个数
public class Score {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] grade = new int[25];
        for (int i = 0; i < 10; i++) {
            grade[i] = 2;
        }
        for (int i = 10; i < 20; i++) {
            grade[i] = 4;
        }
        for (int i = 20; i < 25; i++) {
            grade[i] = 8;
        }
        int result=dfs(0,N,3,grade);
        System.out.println(result);
    }

    //方法一:递归暴力搜索  每道题做对和做错两种情况去讨论 累计做错三次就终止
    //index 0-24的题目题号 rest 凑分数时候剩下没凑的分数 count 当前累积错题数
    /**
     * @param index 题目的题号 从0开始到24
     * @param rest  我们要凑的分数 刚开始是N
     * @param count 错题数 初始为3
     * @param grade 题目分数数组
     * @return
     */
    public static int dfs(int index, int rest, int count, int[] grade) {
        //如果错题0道 且刚好分数凑够 (rest剩下要凑的分数为0) 则说明只有一种情况 满分
            //若rest不是0,说明不存在这种情况 return 0即可
        if (count == 0) {
            return rest == 0 ? 1 : 0;
        }
        //若是分数凑够,rest=0,则只有一种情况 0分
        if (rest == 0) {
            return 1;
        }
        //防止数组越界
        if (index >= grade.length) {
            return 0;
        }
        //当前这道题做错的情况+做对的情况
        return dfs(index + 1, rest, count - 1, grade)
                + dfs(index + 1, rest - grade[index], count, grade);
        //index:无论错对index都得后移,做对得分,做错不得分
        //rest:刚开始是N,我们现在进行凑分数,要是做错这道题不得分所以要凑的分数还是rest
                //做对的话,就把获得的分数减去,得到重新要凑的分数rest
        //count:我们刚开始假设做错了三道题,要是这道题做对则错题数减一;做错不变
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大龄烤红薯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值