百度2015 在线笔试题(3)

题目

关键字:兼职问题

小明需要通过做兼职挣钱,他一天有k点体力,每连续做一次兼职都会消耗1点体力;

现在有n份兼职,按照时间排序,且互不交叉,给定n份兼职的薪水,小明可以每次挑选m份连续的兼职做;

问他一天得到的最大薪水?

分析

寻找k次 最大字段和(m个)问题!

程序设计

#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;

int MaxPay(vector<int> &p, int n, int m, int k)
{
    int maxPay = 0;

    if (m*k >= n)
    {
        int ret = 0;
        for (int i = 0; i < k; i++)
            ret += p[i];
        return ret;
    }

    //选过的兼职不可再选
    int flag = -1;
    //k次连续m兼职最大费用
    vector<int> v;
    //挑选k次
    int c = 0;
    while (c < k)
    {
        maxPay = 0;
        int l = 0;
        for (int i = 0; i < n - m + 1 ; i++)
        {
            //每次挑选m个时间连续的兼职
            int sum = 0;
            for (int j = i;  p[i] != flag && j < i + m; j++)
            {
                sum += p[j];
            }//for
            if (sum > maxPay)
            {
                maxPay = sum;
                l = i;          
            }//if           
        }//for
        v.push_back(maxPay);
        for (int j = l; j < l + m; j++)
        {
            p[j] = flag;
        }//for
        c++;
    }//while

    int ret = 0;
    for (int i = 0; i < k; i++)
        ret += v[i];
    return ret;
}

int main()
{
    int n, m, k;
    cin >> n >> m >> k;
    vector<int> v;

    for (int i = 0; i < n; i++)
    {
        int temp;
        cin >> temp;
        v.push_back(temp);
    }//for
    cout << MaxPay(v, n, m, k) << endl;
    system("pause");
    return 0;
}

注:题目是听朋友描述,记录下来,日后参考!

原文地址:https://www.cnblogs.com/shine-yr/p/5214852.html