小P最近迷上了一个游戏,但他在玩游戏的时候遇到了一个问题。
小P控制n 个角色,标号为1到n,小P有K个怪物可以分配给这n个角色击杀,一个怪物只能分配给一个角色,并且必须要分配给一个角色。
对于第 i(1≤i≤n)个角色,如果没有分配到一个怪物,那么它就会获得经验ci,如果分配到了t(t≥1)个怪物,那么它会获得经验ai+tbi。
小P要把K个怪物分配给这n个角色,问所有角色获得的经验总和最多是多少。
小P最近迷上了一个游戏,但他在玩游戏的时候遇到了一个问题。
小P控制n 个角色,标号为1到n,小P有K个怪物可以分配给这n个角色击杀,一个怪物只能分配给一个角色,并且必须要分配给一个角色。
对于第 i(1≤i≤n)个角色,如果没有分配到一个怪物,那么它就会获得经验ci,如果分配到了t(t≥1)个怪物,那么它会获得经验ai+tbi。
小P要把K个怪物分配给这n个角色,问所有角色获得的经验总和最多是多少。
输入第一行一个整数T,表示有T组数据。
对于每组数据,第一行两个正整数n和K。
接下来n行,每行三个整数ai,bi,ci。
1≤T≤50
1≤n,K≤100000
1≤ai,bi,ci≤100000
对于每组数据,输出一个整数表示答案。
输入
2 2 2 4 1 1 1 3 3 2 2 4 1 1 1 3 4
输出
9 10
# include <bits/stdc++.h>
# define ll long long
using namespace std;
const int maxn = 1e5;
struct node
{
int a, b, c, d;
}m[maxn+3];
bool cmp(node x, node y)
{
return x.d > y.d;
}
ll sum[maxn+3];
int main()
{
int t, n, k;
scanf("%d",&t);
while(t--)
{
ll tot = 0;
scanf("%d%d",&n,&k);
for(int i=1; i<=n; ++i)
{
scanf("%d%d%d",&m[i].a, &m[i].b, &m[i].c);
m[i].d = m[i].a + m[i].b - m[i].c;
}
sort(m+1, m+1+n, cmp);
for(int i=1; i<=n; ++i)
tot += m[i].c, sum[i] = sum[i-1] + m[i].d;
ll ans = 0;
for(int i=1; i<=n; ++i)
{
int l = 1, r = min(n,k-1);//k-1为上限是因为有一个怪已经分配给i了。
while(l<=r)
{
int mid = l+r>>1;
if(m[mid].d > m[i].b)
l = mid+1;
else
r = mid-1;
}
if(r < i) ans = max(ans, (ll)tot + sum[r] + m[i].d + (ll)(k-r-1)*m[i].b);
else ans = max(ans, (ll)tot + sum[r] + (ll)(k-r)*m[i].b);//这里比较巧妙,当r==k-1时这样处理貌似有bug,因为最佳可能是每个人分一个怪,但这里剩下的一个怪强制分给i了,然而枚举到最后一个人时又正确了。
}
printf("%lld\n",ans);
}
return 0;
}