第二题:T2牛奶供应(四)
标签:结构体排序、贪心算法
题意:给定
n
n
n次能够购买原料的机会,第
i
i
i次在第
d
i
d_i
di天,那天能够提供原料
w
i
w_i
wi升,每升价格是
p
i
p_i
pi元。
并且每升牛奶每天的存储费用是
1
1
1元,求需要在第
m
m
m天后提供
L
L
L升加工后的牛奶,如何去收购并加工存储的总费用最少。
数据范围:
1
<
=
n
<
=
1
0
5
1<=n<=10^5
1<=n<=105,
1
<
=
L
<
=
1
0
6
1<=L<=10^6
1<=L<=106,
1
<
=
m
,
w
i
,
p
i
<
=
1
0
6
1<=m,w_i,p_i<=10^6
1<=m,wi,pi<=106,$1<= d_i <m $
题解:首先,看到数据范围这么大,小估估一下就得开
l
o
n
g
l
o
n
g
long\ long
long long,先全局开了。然后考虑
p
i
p_i
pi是第
i
i
i次购买的单价,那我们换个思路一想,就能得到把第
i
i
i次每升牛奶存到第
m
m
m天的费用就是:
p
i
+
m
−
d
i
p_i+m-d_i
pi+m−di(该次每升单价+每升从第
d
i
d_i
di天到第
m
m
m天存储费用)。我们根据费用这个进行结构体排序一下就行了,再从便宜的开始拿直到拿到
L
L
L升算一下总费用就好了。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node {
ll d, w, p;
}a[100005];
bool cmp(node x, node y) {
return x.p < y.p;
}
int main() {
ll n, m, L;
cin >> n >> m >> L;
for (int i = 1; i <= n; i++) {
cin >> a[i].d >> a[i].w >> a[i].p;
a[i].p = a[i].p + m - a[i].d; // 每升原料到第m天需要的费用
}
sort(a + 1, a + 1 + n, cmp);
ll ans = 0;
for (int i = 1; i <= n; i++) {
if (L >= a[i].w) {
ans += a[i].w * a[i].p;
L -= a[i].w;
} else {
ans += L * a[i].p;
L = 0;
}
}
cout << ans << endl;
return 0;
}