这是一道纯贪心题
题目描述
小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者 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 不能在规定期限前完成的扣款数。
输出格式
输出仅一行,表示小伟能赢取最多的钱。
样例 #1
样例输入 #1
10000
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10
样例输出 #1
9950
提示
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 500 1 \le n \le 500 1≤n≤500, 1 ≤ m ≤ 5 × 1 0 5 1 \le m \le 5 \times 10^5 1≤m≤5×105, 1 ≤ t i ≤ n 1 \le t_i \le n 1≤ti≤n, 1 ≤ w i ≤ 1000 1 \le w_i \le 1000 1≤wi≤1000。
主要思路
这道题一看就是标准的贪心题。直接上思路。 思路:因为题中的小游戏都是在1分钟完成的,所以我们并不需要考虑时间所带来的影响,和背包问题就有所不同,可以直接上贪心来做。
第一点,先完成会罚款高的游戏明显明显更有益(时间消耗相同),所以,先要对游戏的罚款进行排序(从大到小)。
第二点,排完序后,就要考虑这个游戏放在那个时间来做,很明显,我们要先处理罚款大的项,而又尽量不影响后面的游戏,只能将这个游戏放在规定最晚完成的时间段来做,若后面已经有游戏正在进行,可以考虑t-1,直到0,如果还没有对它进行安排,则这个游戏主动放弃0
最后,将放弃的游戏的罚款减去,即为所求解。
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
pair<int,int> a[505];
unordered_map<int,bool> mp;
bool cmp(pair<int,int> x,pair<int,int> y)
{
return x.second>y.second;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int m,n,j=1;
cin>>m>>n;
for(int i=1;i<=n;++i)
{
cin>>a[i].first;
}
for(int i=1;i<=n;++i)
{
cin>>a[i].second;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;++i)
{
int flag=0;
for(int j=a[i].first;j>=1;--j)
{
if(mp[j]==0)
{
flag=1;
mp[j]=1;
break;
}
}
if(flag==0)
{
m-=a[i].second;
}
}
cout<<m;
return 0;
}
OK~
<_>