美团笔试题(5)考试策略

链接:https://www.nowcoder.com/questionTerminal/a1792d443f914f2b928d2a157cd7900d
来源:牛客网
 

小明同学在参加一场考试,考试时间2个小时。试卷上一共有n道题目,小明要在规定时间内,完成一定数量的题目。  考试中不限制试题作答顺序,对于 i 第道题目,小明有三种不同的策略可以选择:  (1)直接跳过这道题目,不花费时间,本题得0分。

(2)只做一部分题目,花费pi分钟的时间,本题可以得到ai分。  (3)做完整个题目,花费qi分钟的时间,本题可以得到bi分。 

小明想知道,他最多能得到多少分。

 

输入描述:

第一行输入一个n数表示题目的数量。

接下来n行,每行四个数p_i,a_i,q_i,b_i。(1≤n≤100,1≤p_i≤q_i≤120,0≤a_i≤b_i≤1000
)。


 

输出描述:

输出一个数,小明的最高得分。

示例1

输入

4
20 20 100 60
50 30 80 55
100 60 110 88
5 3 10 6

输出

94

题目思路:

分析题目 求极值的情况而且涉及多个参数 基本上是动态规划求解. 参考某位大佬的答案

1 把输入封装到矩阵里面 这里给出了weight(时间矩阵) 以及value(分数矩阵)

2 利用动态规划 dp, dp表示的是120分钟内的最大分数;dp[110]就是花了110分钟能得到的最大值

3 捋顺一下思路:既然dp就是指最大值 那么最大值来自于 完全做完题目和没有做完题目两种

那我们分三种情况考虑 时间j >= 没有做完的情况 和 j >= 做完的情况 以及都大于的情况

① j >= 做完 且 j >= 没做完 dp[j] = 做完的情况下最大分数 与  没做完情况下最大分数, 以及元数据情况下的比值

② j >= 没做完 dp[j] =   没做完情况下最大分数, 以及元数据情况下的比值

③ j >= 做完情况下最大分数, 以及元数据情况下的比值

我说了一下元数据 并不是原始数据 而是以题目例子来说 我们有4个题目 依次遍历 对于第二次遍历的时候 你第一次已经得到一个dp[j] 那么这个dp[j] 和你第二次遍历的时候对比

注意细节:

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] value = new int[n][2];
        int[][] weight = new int[n][2];
        for(int i = 0; i < n; i++){
            weight[i][0] = sc.nextInt();
            value[i][0] = sc.nextInt();
            weight[i][1] = sc.nextInt();
            value[i][1] = sc.nextInt();
        }
        int[] dp = new int[121];
        for(int i=0; i < n; i++){
            for(int j = 120; j >= weight[i][0] || j >= weight[i][1]; j--){
                if(j >= weight[i][0] && j >= weight[i][1]){
                    dp[j] = Math.max(Math.max(dp[j - weight[i][1]] + value[i][1], 
                                     dp[j - weight[i][0]] + value[i][0]),
                                             dp[j]); 
                }else if(j >= weight[i][0]){
                    dp[j] = Math.max(dp[j - weight[i][0]] + value[i][0], dp[j]);

                }else
                    dp[j] = Math.max(dp[j-weight[i][1]] + value[i][1], dp[j]);
            }
        }
        System.out.println(dp[120]);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值