http://acm.hdu.edu.cn/showproblem.php?pid=6546
一开始想转化成费用流来做,太傻了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+100;
typedef long long ll;
int n,m;
int a[maxn],b[maxn],c[maxn];
ll ans;
struct Node{
int i,x;
bool operator < (const Node res)const{
return 2*a[i]*x+a[i]+b[i]>2*a[res.i]*res.x+a[res.i]+b[res.i];
}
};
int main()
{
while(cin>>n>>m)
{
ans=0;
priority_queue<Node> Q;
m-=n;
for(int i=1;i<=n;i++)cin>>a[i]>>b[i]>>c[i],ans+=a[i]+b[i]+c[i],Q.push((Node){i,1});
while(m--)
{
Node u=Q.top();
Q.pop();
ans+=2*a[u.i]*u.x+a[u.i]+b[u.i];
u.x++;
Q.push(u);
}
cout<<ans<<endl;
}
return 0;
}