站外题求条
  • 板块灌水区
  • 楼主blue_peace
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/10/14 20:23
  • 上次更新2024/10/14 21:36:36
查看原帖
站外题求条
1246468
blue_peace楼主2024/10/14 20:23

题面:

Problem Description

小明家里安装了一台智能电表,可以实时调节用电功率。每天分为 nn 个时段,每个时段的电价不同。小明希望在满足总用电量的前提下,最小化总电费支出。已知每个时段的电价,以及允许的最大电量和最小电量,请你帮小明制定一个最优的用电方案,使得总电费最少。

Input Description

第一行包含两个整数 nnmm ,分别表示时段数量和总用电量。

接下来 nn 行,每行包含三个整数 pip_ilil_ihih_i ,分别表示第 ii 个时段的电价、最小电量和最大电量。

Output Description

输出 nn 个整数,表示每个时段的用电量,用空格分隔。如果无法满足条件,输出一行 IMPOSSIBLE

Samples

Input#1

3 10
1 0 5
2 0 5
3 0 5

Output#1

5 5 0

Input#2

2 10
1 2 4
2 3 5

Output#2

IMPOSSIBLE

Input#3

3 20
1 0 5
2 0 5
3 10 15

Output#3

5 5 10

Hint

1n100000,1m,p1000000000,0l<h10000000001 \le n \le 100000, 1 \le m , p \le 1000000000 , 0 \le l < h \le 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;
}

求条,小号悬一棺

2024/10/14 20:23
加载中...