题目链接:​​https://vijos.org/d/ybttg/p/5c24b624f41362c9e1912649​​​

时间限制:1000 ms 内存限制:512 MiB

题目描述

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

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

输入格式

输入共四行。

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

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

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

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

输出格式

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

样例输入


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


样例输出


9950


限制与提示


对于 100 % 100\% 100%的数据,有 n ≤ 500 , 1 ≤ t i ≤ n n\le 500,1\le t_i\le n n≤500,1≤ti≤n。


解题思路

题意: 给你m元钱让你做n个任务,每一个任务要花一整天做,而且每个任务都有自己的截止日期,若是在截止日期之前没做完会扣掉相应的钱。

思路: 这是一道入门级别的贪心题目,目的是为了得到更多的钱,就需要扣最少的钱,所以要将扣钱当作首要元素考虑,再去考虑截止日期。按扣钱数由大到小,截止日期由大到小排序。为因为钱数越大越重要,截止日期越靠后那完成他的时间就越长。定义一个vis数组来储存是否用过那天,每一个物品都从截止日期往前搜索直到有一天没有用过。(越晚做越好,腾出前面的时间)若是没有符合条件的则扣钱。

Accepted Code:

/* 
* @Author: lzyws739307453
* @Language: C++
*/
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 505;
struct edge {
int t, w;
edge() {}
edge(int t, int w) : t(t), w(w) {}
bool operator < (const edge &s) const {
return w > s.w;
}
}p[MAXN];
bool vis[MAXN];
int main() {
int n, m;
scanf("%d%d", &m, &n);
for (int i = 0; i < n; i++)
scanf("%d", &p[i].t);
for (int i = 0; i < n; i++)
scanf("%d", &p[i].w);
sort(p, p + n);
for (int i = 0; i < n; i++) {
int r = p[i].t;
while (r > 0 && vis[r])
r--;
if (r > 0) vis[r] = true;
else m -= p[i].w;
}
printf("%d\n", m);
return 0;
}