貪心算法訓練(八)——智力大沖浪(帶期限和罰款的單位時間調度問題)

貪心算法訓練(八)——智力大沖浪(帶期限和罰款的單位時間調度問題)

1. 問題描述

  小偉報名參加某電視臺的智力大沖浪節目,本次挑戰賽吸引了衆多參賽者,主持人爲了表彰大家的勇氣,先獎勵每個參賽者 m 元。不要高興太早,因爲這些錢還不一定是你的!接下來主持人宣佈了比賽規則:

  首先,比賽時間分爲 n 個時段(n <= 500),比賽又給出了很多小遊戲,每個小遊戲都必須在規定期限 $t_1$ 內完成(1 <= $t_1$ <= n)。如果一個遊戲沒能在規定期限內完成,則要從獎勵費 m 元中扣去一部分錢 $w_i$,$w_i$ 爲自然數,不同的遊戲扣去的錢是不一樣的。當然,每個遊戲本身都很簡單,保證每個參賽者都能在一個時段內完成,而且都必須從整數時段開始。主持人只是想考一考每個參賽者都如何安排自己做遊戲的順序。作爲參賽者,小偉很想贏得冠軍,當然更想贏取最多的錢,注意:此比賽絕對不會讓參賽者賠錢。

2. 輸入格式

  輸入共 4 行

  第一行爲 m,表示一開始獎勵給每位參賽者的錢

  第二行爲 n, 表示有 n 個小遊戲

  第三行有 n 個數,分別表示遊戲 1到 n 的規定完成期限

  第四行有 n 個數,分別表示遊戲 1 到 n 不能在規定期限內完成的扣款數額

3. 輸出格式

  輸出僅一行,表示小偉能贏取的最多的錢

4. 樣例輸入

10000
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10

5. 樣例輸出

9950

6. 思路分析

  按照扣款額度從大到小排序,順序處理每個任務,使其儘可能往後安排,如果不能安排,則選擇扣款

7. 代碼(題目中數據默認按降序,所以我就不排序了)

#include <iostream>
#include <cstring>

using namespace std;

int m,n;
int date[505],money[505],arrange[505];

int Solve(int time);

int main()
{
    ios::sync_with_stdio(false);
    cin>>m>>n;
    memset(arrange,-1,sizeof(arrange));
    int i = 1;
    for(;i <= n;i++)
        cin>>date[i];
    for(i = 1;i <= n;i++)
        cin>>money[i];
    for(i = 1;i <= n;i++)
    {
        int k = Solve(date[i]);
        if(k != -1)
            continue;
        else
            m -= money[i];
    }
    cout<<m;
    return 0;
}
int Solve(int time)
{
    int i = time;
    while(i >= 1)
    {
        if(arrange[i] == -1)
        {
            arrange[i] = 1;
            time = i;
            return time;
        }
        else
            i--;
    }
    return -1;
}

 

posted @ 2018-08-12 11:02 Nikki_o3o 閱讀(...) 評論(...) 編輯 收藏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章