题意
有 n n n 个游戏,每个游戏都有它的限定时间 t i t_{i} ti(玩一个游戏会耗费 1 1 1 时间),如果超过了当前的限定时间,就扣除 w i w_{i} wi 元钱,你现在有 m m m 元钱,问怎样排列游戏才能使扣除的钱最少。
思路
我们考虑如果要使扣除的钱最少,就应该优先处理扣除的钱最多的游戏,按扣除的钱从大到小排序。
如果在完成的时间期限内还有某个时间点没有被安排玩游戏,就将其安排成当前要玩的游戏。
如果没有了,也就代表不可能再有时间去玩这个游戏了,扣除 w i w_{i} wi 元。
代码
#include<bits/stdc++.h>
using namespace std;
struct node{
int t,w;
}a[100001];
bool vis[100001];
bool cmp(node x,node y){return x.w>y.w;}
int main()
{
int ans,n;
scanf("%d %d",&ans,&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i].t);
for(int i=1;i<=n;i++) scanf("%d",&a[i].w);
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
int cnt=a[i].t;
while(vis[cnt]==1) cnt--;
if(cnt>0) vis[cnt]=1;
else ans-=a[i].w;
}
printf("%d\n",ans);
return 0;
}