贪心算法(5.智力大冲浪+解题思路)

1、带期限和罚款的单位时间任务调度

                                                        智力大冲浪

题目描述

小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者  元。先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则:

首先,比赛时间分为  个时段,它又给出了很多小游戏,每个小游戏都必须在规定期限  前完成。如果一个游戏没能在规定期限前完成,则要从奖励费  元中扣去一部分钱 , 为自然数,不同的游戏扣去的钱是不一样的。当然,每个游戏本身都很简单,保证每个参赛者都能在一个时段内完成,而且都必须从整时段开始。主持人只是想考考每个参赛者如何安排组织自己做游戏的顺序。作为参赛者,小伟很想赢得冠军,当然更想赢取最多的钱!注意:比赛绝对不会让参赛者赔钱!

输入格式

输入共四行。

第一行为 ,表示一开始奖励给每位参赛者的钱;

第二行为 ,表示有  个小游戏;

第三行有  个数,分别表示游戏  到  的规定完成期限;

第四行有  个数,分别表示游戏  到  不能在规定期限前完成的扣款数。

输出格式

输出仅一行,表示小伟能赢取最多的钱。

样例

样例输入

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

样例输出

9950

解题思路: 

    按照贪心策略,将扣款数额大的,尽量在规定时间内完成,所以将按照罚款数额的大小进行排序。

    如果完成期限是t,尽量在接近t的时候去完成这个任务,比如截止期限有1 ,3 ,4,给定时间4,本来都可以完成,如果先去完成时间3或者4,那么任务1就完成不了了。

    题目中已给出部分//注释

例题:https://loj.ac/problem/10004

AC代码:

#include<bits/stdc++.h>

using namespace std;
struct node
{
    int date,cost;
};
node s[505];
int book[505];
int cmp(const node &a,const node &b){return a.cost>b.cost;}
int main()
{
    int m,n;
    cin>>m;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>s[i].date;
    }
    for(int i=0;i<n;i++){
        cin>>s[i].cost;
    }
    sort(s,s+n,cmp);
    int sign,sum=0,signnum;
    for(int i=0;i<n;i++){
        sign = 0;
        for(int j=s[i].date;j>=1;j--){//在规定时间内,找有没有时间段可以去完成
                                      //for循环顺序很重要,尽量接近完成期限去完成,
            if(book[j]==0){book[j] = 1;sign = 1;break;}
        }
        if(sign==0)//找不到完成的时间段,证明此任务直接放弃
        {
            sum+=s[i].cost;
        }
    }
    printf("%d
",m-sum);
}

参考书籍为:信息学奥赛一本通

只能选择相信自己,如果此时你放弃了,那些无数个夜晚幻想过的明天,也将成为泡沫。 

原文地址:https://www.cnblogs.com/codepeanut/p/12920502.html