本人不才,第一次写题解
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