下文中的 m 指题目中的 t。
大致思路是每天做题目数前 m 大的科目,然后将这 m 个科目都做去其中题目数最少的科目(也就是题目数第 m 大的科目),用堆维护。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const int N=1e6+5;
priority_queue<ll>q;
int n,m;
ll x,ans,a[N];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&x),q.push(x);
for(;q.size()>=m;){
for(int i=1;i<m;i++)a[i]=q.top(),q.pop();
x=q.top();q.pop();ans+=x;
for(int i=1;i<m;i++)if(a[i]-x>0)q.push(a[i]-x);
}
printf("%lld",ans);
return 0;
}