本人不才,第一次写题解
1.首先我们要定义一个结构体
struct jb{ int w; int t; }a[100010];
2.然后我们要让催最久的人去做事,尽量把他们利用掉,从时间大用到时间小所以要排序解决
bool cmp(jb x,jb y){ return x.t>y.t; } sort(a+1,a+1+n,cmp);
3.开始用人,把时间最长人的用掉v[n](时间最短的人可以来干别的事),事情做完一件了就减一件:k--,顺便标记一下这件事情(v[i]=1),顺便标记一下这个人(待会才不会又用到这个人)v2[i]=1,毕竟待会有别的人想要做这件事情才不重复.
for(int i=1;i<=n;i++){ if(!v[a[i].w])v[a[i].w]=true,v2[i]=true,k--; if(!k){ cout<<ans<<endl; return 0; } }
4.把时间长的人遍历完了,用完了。所以我们要用那些没被用到的(例如 i想做g,j也想做g,而i用的时间长,那就用i。j拿去干别的事),这时优先采用时间少的人,并且这时不需要管做的是哪件事(因为前面若能用就用完了),所以开始统计时间,每选一个人,就减少剩余的一件事:k--,最后k为零时就可以输出啦!
for(int i=n;i>=1;i--){ if(!v2[i])ans=ans+a[i].t,k--; if(!k)break; }
5.所以我们要用排序去解决最多最少1且多元素的问题!!!
6.给个赞吧,有问题留个言,求你们了qwq