题面:
小明家里安装了一台智能电表,可以实时调节用电功率。每天分为 n 个时段,每个时段的电价不同。小明希望在满足总用电量的前提下,最小化总电费支出。已知每个时段的电价,以及允许的最大电量和最小电量,请你帮小明制定一个最优的用电方案,使得总电费最少。
第一行包含两个整数 n 和 m ,分别表示时段数量和总用电量。
接下来 n 行,每行包含三个整数 pi 、li 和 hi ,分别表示第 i 个时段的电价、最小电量和最大电量。
输出 n 个整数,表示每个时段的用电量,用空格分隔。如果无法满足条件,输出一行 IMPOSSIBLE。
3 10
1 0 5
2 0 5
3 0 5
5 5 0
2 10
1 2 4
2 3 5
IMPOSSIBLE
3 20
1 0 5
2 0 5
3 10 15
5 5 10
1≤n≤100000,1≤m,p≤1000000000,0≤l<h≤1000000000
代码:
#include <algorithm>
#include <iostream>
using namespace std;
typedef struct Ele{
int id, p, l, h;
bool operator < (Ele e) const {
return p < e.p;
}
} Ele;
int n, m;
Ele eles[100001];
bool cmp(Ele e, Ele l) {
return e.id < l.id;
}
int main() {
cin >> n >> m;
int _ = 0;
for (int i = 0; i < n; i++) {
cin >> eles[i].p >> eles[i].l >> eles[i].h;
eles[i].id = i;
_ += eles[i].h - eles[i].l;
m -= eles[i].l;
}
if (m < 0 || m > _) {
cout << "IMPOSSIBLE";
return 0;
}
sort(eles, eles + n);
eles[0].l += m;
for (int i =0; i < n-1; i++) {
if (eles[i].l <= eles[i].h) break;
eles[i+1].l += eles[i].l - eles[i].h;
eles[i].l = eles[i].h;
}
sort(eles, eles + n, cmp);
for (int i = 0; i < n; i++) {
cout << eles[i].l << ' ';
}
cout << '\n';
return 0;
}
求条,小号悬一棺