- 熟悉的一本通链接
- 看题干就知道这道题和【例题5】智力大冲浪思路相同,于是我把这道题的代码(附思路)改了改交上去,果不其然,超时两个点。
- 那么有没有优化的办法呢?当然是有的。
- 优化的关键就在于记录前面从哪里开始已经满员了,例如从1~x都已经排了任务,就记录x,下次就可以只搜索到x或者截止日期在x之前就直接continue。
代码
#include<bits/stdc++.h>
using namespace std;
struct cyy{
long long t,w;
}a[1000010];
bool cmp(cyy x,cyy y){return x.w>y.w;}
long long m,n,s,d=-1;
bool f[1000010],x;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].t,&a[i].w);
sort(a+1,a+n+1,cmp);
m=0;
for(int i=1;i<=n;i++){
if(a[i].t<=d) continue;
x=0;
for(int j=a[i].t;j>d;j--)
if(!f[j]){
f[j]=1,m+=a[i].w,x=1;
break;
}
if(!x) d=a[i].t;
}
printf("%d\n",m);
return 0;
}