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\n",m-sum); }
参考书籍为:信息学奥赛一本通
只能选择相信自己,如果此时你放弃了,那些无数个夜晚幻想过的明天,也将成为泡沫。