Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ หากำไรสูงสุดจากการซื้อขายข้าวสาลีระหว่างเมือง

สมมติว่ามี n เมืองเชื่อมต่อกันด้วย m ถนน ซึ่งเป็นถนน חד-ทิศทาง (ไปได้เพียงทางเดียว) ถนนถูกกำหนดในรูปแบบ {ต้นทาง, ปลายทาง} ในแต่ละเมืองมีราคาข้าวสาลีต่างกัน ตัวแปร price เก็บราคาที่เมืองที่ i นักเดินทางสามารถซื้อข้าวสาลีจากเมืองใดก็ได้ และเดินทางไปขายที่เมืองอื่น (หากเดินทางได้) เป้าหมายคือหากำไรสูงสุดที่เป็นไปได้

ตัวอย่าง: n = 5, m = 3, price = {4, 6, 7, 8, 5}, roads = {{1, 2}, {2, 3}, {2, 4}, {4, 5}} ผลลัพธ์คือ 4 โดยซื้อที่เมือง 1 (ราคา 4) และขายที่เมือง 4 (ราคา 8) กำไร = 4

ขั้นตอนการแก้ปัญหา

  1. สร้างกราฟ graph ขนาด n×n จากอาร์เรย์ roads (ปรับดัชนีเป็น 0-based)
  2. สร้างอาร์เรย์ tp ขนาด n เริ่มต้นค่าเป็น -infinity
  3. วนลูป i = 0 ถึง n-1 สำหรับแต่ละจุด u ใน graph[i] อัปเดต tp[u] = min(tp[u], tp[i], price[i])
  4. คำนวณผลลัพธ์ res = max(res, price[i] - tp[i]) สำหรับทุก i
  5. คืนค่า res

ตัวอย่างโค้ด C++

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

int solve(int n, int m, vector<int> price, vector<pair<int, int>> roads) {
    vector<vector<int>> graph(n);
    for(int i = 0; i < m; i++) {
        int x = roads[i].first;
        int y = roads[i].second;
        x--; y--;
        graph[x].push_back(y);
    }
    vector<int> tp(n, INT_MAX);
    for(int i = 0; i < n; i++) {
        for(int u : graph[i]) {
            tp[u] = min({tp[u], tp[i], price[i]});
        }
    }
    int res = INT_MIN;
    for(int i = 0; i < n; i++) {
        res = max(res, price[i] - tp[i]);
    }
    return res;
}

int main() {
    int n = 5, m = 3;
    vector<int> price = {4, 6, 7, 8, 5};
    vector<pair<int, int>> roads = {{1, 2}, {2, 3}, {2, 4}, {4, 5}};
    cout << solve(n, m, price, roads);
    return 0;
}

อินพุต / เอาต์พุต

Input: 5, 3, {4, 6, 7, 8, 5}, {{1, 2}, {2, 3}, {2, 4}, {4, 5}}

Output: 4