zoukankan      html  css  js  c++  java
  • 美团笔试题_小明得到的最高分

    题目:

    小明同学,在参加1场考试,考试时间是两个小时,试卷上一共有n道题目,小明要在规定的时间内完成一定数量的题目;

    考试中不限制试题作答顺序,对于第i道题目,小明有三种不同的策略进行选择:

    (1)直接跳过这道题目不花费时间,本题得0分;

    (2)只做一部分题目,花费pi分钟的时间,本题可以得到ai分;

    (3)做完整个题目花费qi分钟的时间,可以得到bi分;

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

    输入:

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

    接下来n行 ,每行四个数表示pi,ai,qi,bi(1<=n<=100,1<=pi<=qi<=120,0<=ai<=bi<1000);

    输出:

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

    样例输入:

    20  20  100  60 

    50  30  80  55

    100  50 110  88

    5  3  10  6

    样例输出:

    94

    思路:

    稍微复杂点的背包问题;

    实现:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int TIME = 121;
     4 int process(const vector<int>& p,const vector<int>& a,
     5             const vector<int>& q,const vector<int>& b) {
     6     int n = p.size();
     7     if (n == 0) return 0;
     8 
     9     vector<vector<int> > memo(n,vector<int>(TIME+1,-1));
    10     for (int j = 0; j <= TIME; ++j) {
    11         memo[0][j] = (j >= p[0] ? a[0]:0);
    12         memo[0][j] = (j >= q[0] && b[0] > a[0] ? b[0]:memo[0][j]);
    13     }
    14 
    15     for (int i = 1; i < n; ++i) {
    16         for (int j = 0; j <= TIME ; ++j) {
    17             memo[i][j] = memo[i-1][j];
    18             if (j >= p[i])
    19                 memo[i][j] = max(memo[i][j],a[i] + memo[i-1][j-p[i]]);
    20             if (j >= q[i]) {
    21                 memo[i][j] = max(memo[i][j],b[i] + memo[i-1][j-q[i]]);
    22             }
    23         }
    24     }
    25 
    26     return memo[n-1][TIME];
    27 }
    28 
    29 
    30 int main()
    31 {
    32     int n;
    33     cin >> n;
    34     int dp[TIME];
    35     memset(dp, 0, TIME * sizeof(int));
    36     int p, a, q, b;
    37 
    38     vector<int> pVector;
    39     vector<int> aVector;
    40     vector<int> qVector;
    41     vector<int> bVector;
    42 
    43     for (int k = 0; k < n; ++k) {
    44         cin >> p >> a >> q >> b;
    45         pVector.push_back(p);
    46         aVector.push_back(a);
    47         qVector.push_back(q);
    48         bVector.push_back(b);
    49     }
    50     cout << process(pVector,aVector,qVector,bVector);
    51 }

    -------64%解法-,留作参考---------------------------

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int TIME = 121;
     5 
     6 int main()
     7 {
     8     int n;
     9     cin >> n;
    10     int dp[TIME];
    11     memset(dp, 0, TIME * sizeof(int));
    12     int p, a, q, b;
    13     int i, j;
    14     for (i = 0; i < n; i++)
    15     {
    16         cin >> p >> a >> q >> b;
    17         for (j = 0; j + p < TIME; j++)
    18         {
    19             dp[j] = max(dp[j], dp[j + p] + a);
    20         }
    21         for (j = 0; j + q < TIME; j++)
    22         {
    23             dp[j] = max(dp[j], dp[j + q] + b);
    24         }
    25     }
    26     int ret = 0;
    27     for (i = 0; i < TIME; i++)
    28     {
    29         ret = max(ret, dp[i]);
    30     }
    31     cout << ret;
    32 }
    专注搬砖,擅长搬砖砸自己的脚~~~ Email: ltwbuaa@163.com
  • 相关阅读:
    知识搜索
    使用 getopt() 进行命令行处理
    【新提醒】夏新大v安卓4.1尝鲜最新更新版本发布(包含进步版)1124更新 大V综合交流区 360论坛
    搜狗知立方高调亮相 开启知识计算新时代
    socat: Linux / UNIX TCP Port Forwarder
    Crontab 每两周执行一次
    python 命令行解析 optionparser
    crontab jojo's blog--快乐忧伤都与你同在 BlogJava
    搜索引擎开始「实体搜索」新领域竞争,Google、百度分别发力实体搜索产品
    netcat(nc)的替代产品 Socat
  • 原文地址:https://www.cnblogs.com/TonvyLeeBlogs/p/9601339.html
Copyright © 2011-2022 走看看