#include <iostream>
#include <vector>
#include <map>
#include <utility> // Diperlukan untuk std::pair
// Struktur data untuk menyimpan informasi satu pendonor
struct Pendonor {
int kode_desa;
int kode_golongan_darah; // Tidak digunakan untuk perhitungan ini
int volume_darah_ml;
};
/**
* Menghitung jumlah total pendonor dan volume darah yang didonasikan
* untuk setiap kode desa.
* * @param data_pendonor Vektor berisi data semua pendonor.
* @return Map: {Kode_Desa: <Jumlah_Pendonor, Total_Volume_ml>}
*/
std::map<int, std::pair<int, int>> hitung_donor_dan_volume(const std::vector<Pendonor>& data_pendonor) {
// Map untuk menyimpan hasil. Key = Kode Desa, Value = Pair <Jumlah, Volume>
std::map<int, std::pair<int, int>> hasil_akumulasi;
// Loop melalui setiap data pendonor
for (const auto& donor : data_pendonor) {
int kode_desa = donor.kode_desa;
int volume = donor.volume_darah_ml;
// Jika kode_desa belum ada, map akan membuatnya dan menginisialisasi nilainya (0, 0)
// Akumulasi Jumlah Pendonor (first element of the pair)
hasil_akumulasi[kode_desa].first += 1;
// Akumulasi Total Volume Darah (second element of the pair)
hasil_akumulasi[kode_desa].second += volume;
}
return hasil_akumulasi;
}
int main() {
// --- DATA MASUKAN UJI COBA (Contoh dari Buku) ---
// Format: {Kode Desa, Kode Golongan Darah, Volume Darah (ml)}
std::vector<Pendonor> data_uji = {
{3, 1, 150},
{1, 2, 250},
{3, 4, 200},
{2, 1, 100},
{1, 3, 250},
{1, 2, 200},
{2, 4, 100},
{3, 1, 150}
};
// Eksekusi fungsi perhitungan
std::map<int, std::pair<int, int>> hasil = hitung_donor_dan_volume(data_uji);
// --- MENAMPILKAN HASIL ---
std::cout << "--- Laporan Hasil Sub Problem 2 ---" << std::endl;
// std::map menjamin iterasi dilakukan berdasarkan urutan kunci (Kode Desa)
for (const auto& pair : hasil) {
int kode_desa = pair.first;
int jumlah_pendonor = pair.second.first;
int total_volume = pair.second.second;
std::cout << "Desa " << kode_desa << ": "
<< jumlah_pendonor << " Pendonor, "
<< total_volume << " ml" << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dXRpbGl0eT4gLy8gRGlwZXJsdWthbiB1bnR1ayBzdGQ6OnBhaXIKCi8vIFN0cnVrdHVyIGRhdGEgdW50dWsgbWVueWltcGFuIGluZm9ybWFzaSBzYXR1IHBlbmRvbm9yCnN0cnVjdCBQZW5kb25vciB7CiAgICBpbnQga29kZV9kZXNhOwogICAgaW50IGtvZGVfZ29sb25nYW5fZGFyYWg7IC8vIFRpZGFrIGRpZ3VuYWthbiB1bnR1ayBwZXJoaXR1bmdhbiBpbmkKICAgIGludCB2b2x1bWVfZGFyYWhfbWw7Cn07CgovKioKICogTWVuZ2hpdHVuZyBqdW1sYWggdG90YWwgcGVuZG9ub3IgZGFuIHZvbHVtZSBkYXJhaCB5YW5nIGRpZG9uYXNpa2FuIAogKiB1bnR1ayBzZXRpYXAga29kZSBkZXNhLgogKiAqIEBwYXJhbSBkYXRhX3BlbmRvbm9yIFZla3RvciBiZXJpc2kgZGF0YSBzZW11YSBwZW5kb25vci4KICogQHJldHVybiBNYXA6IHtLb2RlX0Rlc2E6IDxKdW1sYWhfUGVuZG9ub3IsIFRvdGFsX1ZvbHVtZV9tbD59CiAqLwpzdGQ6Om1hcDxpbnQsIHN0ZDo6cGFpcjxpbnQsIGludD4+IGhpdHVuZ19kb25vcl9kYW5fdm9sdW1lKGNvbnN0IHN0ZDo6dmVjdG9yPFBlbmRvbm9yPiYgZGF0YV9wZW5kb25vcikgewogICAgLy8gTWFwIHVudHVrIG1lbnlpbXBhbiBoYXNpbC4gS2V5ID0gS29kZSBEZXNhLCBWYWx1ZSA9IFBhaXIgPEp1bWxhaCwgVm9sdW1lPgogICAgc3RkOjptYXA8aW50LCBzdGQ6OnBhaXI8aW50LCBpbnQ+PiBoYXNpbF9ha3VtdWxhc2k7CgogICAgLy8gTG9vcCBtZWxhbHVpIHNldGlhcCBkYXRhIHBlbmRvbm9yCiAgICBmb3IgKGNvbnN0IGF1dG8mIGRvbm9yIDogZGF0YV9wZW5kb25vcikgewogICAgICAgIGludCBrb2RlX2Rlc2EgPSBkb25vci5rb2RlX2Rlc2E7CiAgICAgICAgaW50IHZvbHVtZSA9IGRvbm9yLnZvbHVtZV9kYXJhaF9tbDsKCiAgICAgICAgLy8gSmlrYSBrb2RlX2Rlc2EgYmVsdW0gYWRhLCBtYXAgYWthbiBtZW1idWF0bnlhIGRhbiBtZW5naW5pc2lhbGlzYXNpIG5pbGFpbnlhICgwLCAwKQogICAgICAgIAogICAgICAgIC8vIEFrdW11bGFzaSBKdW1sYWggUGVuZG9ub3IgKGZpcnN0IGVsZW1lbnQgb2YgdGhlIHBhaXIpCiAgICAgICAgaGFzaWxfYWt1bXVsYXNpW2tvZGVfZGVzYV0uZmlyc3QgKz0gMTsKICAgICAgICAKICAgICAgICAvLyBBa3VtdWxhc2kgVG90YWwgVm9sdW1lIERhcmFoIChzZWNvbmQgZWxlbWVudCBvZiB0aGUgcGFpcikKICAgICAgICBoYXNpbF9ha3VtdWxhc2lba29kZV9kZXNhXS5zZWNvbmQgKz0gdm9sdW1lOwogICAgfQoKICAgIHJldHVybiBoYXNpbF9ha3VtdWxhc2k7Cn0KCmludCBtYWluKCkgewogICAgLy8gLS0tIERBVEEgTUFTVUtBTiBVSkkgQ09CQSAoQ29udG9oIGRhcmkgQnVrdSkgLS0tCiAgICAvLyBGb3JtYXQ6IHtLb2RlIERlc2EsIEtvZGUgR29sb25nYW4gRGFyYWgsIFZvbHVtZSBEYXJhaCAobWwpfQogICAgc3RkOjp2ZWN0b3I8UGVuZG9ub3I+IGRhdGFfdWppID0gewogICAgICAgIHszLCAxLCAxNTB9LAogICAgICAgIHsxLCAyLCAyNTB9LAogICAgICAgIHszLCA0LCAyMDB9LAogICAgICAgIHsyLCAxLCAxMDB9LAogICAgICAgIHsxLCAzLCAyNTB9LAogICAgICAgIHsxLCAyLCAyMDB9LAogICAgICAgIHsyLCA0LCAxMDB9LAogICAgICAgIHszLCAxLCAxNTB9CiAgICB9OwoKICAgIC8vIEVrc2VrdXNpIGZ1bmdzaSBwZXJoaXR1bmdhbgogICAgc3RkOjptYXA8aW50LCBzdGQ6OnBhaXI8aW50LCBpbnQ+PiBoYXNpbCA9IGhpdHVuZ19kb25vcl9kYW5fdm9sdW1lKGRhdGFfdWppKTsKCiAgICAvLyAtLS0gTUVOQU1QSUxLQU4gSEFTSUwgLS0tCiAgICBzdGQ6OmNvdXQgPDwgIi0tLSBMYXBvcmFuIEhhc2lsIFN1YiBQcm9ibGVtIDIgLS0tIiA8PCBzdGQ6OmVuZGw7CiAgICAKICAgIC8vIHN0ZDo6bWFwIG1lbmphbWluIGl0ZXJhc2kgZGlsYWt1a2FuIGJlcmRhc2Fya2FuIHVydXRhbiBrdW5jaSAoS29kZSBEZXNhKQogICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogaGFzaWwpIHsKICAgICAgICBpbnQga29kZV9kZXNhID0gcGFpci5maXJzdDsKICAgICAgICBpbnQganVtbGFoX3BlbmRvbm9yID0gcGFpci5zZWNvbmQuZmlyc3Q7CiAgICAgICAgaW50IHRvdGFsX3ZvbHVtZSA9IHBhaXIuc2Vjb25kLnNlY29uZDsKCiAgICAgICAgc3RkOjpjb3V0IDw8ICJEZXNhICIgPDwga29kZV9kZXNhIDw8ICI6ICIgCiAgICAgICAgICAgICAgICAgIDw8IGp1bWxhaF9wZW5kb25vciA8PCAiIFBlbmRvbm9yLCAiIAogICAgICAgICAgICAgICAgICA8PCB0b3RhbF92b2x1bWUgPDwgIiBtbCIgPDwgc3RkOjplbmRsOwogICAgfQoKICAgIHJldHVybiAwOwp9