传送门 0训练士兵 - 蓝桥云课
const int N = 1e5 + 10;
LL n,s;
struct Node
{
LL p,c;
bool operator< (const Node &t) const
{
return c < t.c;
}
}a[N];
void solve()
{
cin >> n >> s;
LL sum = 0;//还需训练的士兵的总代价
for (int i = 1;i <= n;i ++)
{
LL p,c;cin >> p >> c;
a[i] = {p,c};
sum += p;
}
sort(a + 1,a + 1 + n);//按照训练次数从小到大排序
LL ans = 0,t = 0;//t:当前全部士兵一起已经训练的次数
for (int i = 1;i <= n;i ++)
{
if (s <= sum)
{
ans += s * (a[i].c - t);
t += a[i].c - t;
sum -= a[i].p;//这个士兵已经顶级
}
else
{
ans += (a[i].c - t) * a[i].p;
}
}
cout << ans << endl;
}