Files
leetcode-master/problems/kamacoder/0151.手机流畅运行的秘密.md
programmercarl 268c5b2adc Update
2024-08-06 11:26:17 +08:00

3.1 KiB
Raw Blame History

151. 手机流畅运行的秘密

题目链接

先运行 能留下电量多的 任务,才能有余电运行其他任务。

任务11:10 ,运行完 能留下 9个电

任务22:12运行完 能留下 10个电

任务33:10运行完 能留下 7个电。

运行顺序: 任务2 -> 任务1 -> 任务3

按照 最低初始电量 - 耗电量,从大到小排序。

计算总电量,需要 从小到大 遍历, 不断取 总电量 + 任务耗电量 与 任务最低初始电量 的最大值。

#include<bits/stdc++.h>
using namespace std;

bool cmp(const pair<int,int>& taskA, const pair<int,int>& taskB) {
    return (taskA.second - taskA.first) < (taskB.second - taskB.first);
}
int main() {
    string str, tmp;
    vector<pair<int,int>> tasks;

    //处理输入
    getline(cin, str);
    stringstream ss(str);
    while (getline(ss, tmp, ',')) {
        int p = tmp.find(":");
        string a = tmp.substr(0, p);
        string b = tmp.substr(p + 1);
        tasks.push_back({stoi(a), stoi(b)});
    }

    // 按照差值从小到大排序
    sort(tasks.begin(), tasks.end(), cmp);

    // 收集结果
    int result = 0;
    for (int i = 0 ; i < tasks.size(); i++) {
        result = max(result + tasks[i].first, tasks[i].second);
    }

    result =  result <= 4800 ? result : -1;
    cout << result << endl;

}

Java版本

import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        String[] tasksArray = str.split(",");
        List<Pair> tasks = Arrays.stream(tasksArray)
                                 .map(task -> {
                                     String[] parts = task.split(":");
                                     return new Pair(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]));
                                 })
                                 .collect(Collectors.toList());

        // 按照差值从小到大排序
        Collections.sort(tasks, (taskA, taskB) ->
            (taskA.second - taskA.first) - (taskB.second - taskB.first)
        );

        // 收集结果
        int result = 0;
        for (Pair task : tasks) {
            result = Math.max(result + task.first, task.second);
        }

        result = result <= 4800 ? result : -1;
        System.out.println(result);
    }
}

class Pair {
    int first;
    int second;

    Pair(int first, int second) {
        this.first = first;
        this.second = second;
    }
}
 

Python版本

def main():
    import sys
    input = sys.stdin.read

    str = input().strip()
    tasks = []
    for tmp in str.split(','):
        a, b = map(int, tmp.split(':'))
        tasks.append((a, b))

    # 按照差值从小到大排序
    tasks.sort(key=lambda task: task[1] - task[0])

    # 收集结果
    result = 0
    for task in tasks:
        result = max(result + task[0], task[1])

    result = result if result <= 4800 else -1
    print(result)

if __name__ == "__main__":
    main()