Volta.guideVolta.guide
Home
Introduzione
Materiale
Risorse
Algobadge
Home
Introduzione
Materiale
Risorse
Algobadge
  • Splitting the bill

Splitting the bill

Link: https://training.olinfo.it/task/ois_money
Fonte: OIS 2020 Round 1

Categoria

greedy

Descrizione rapida del problema

Hint 1:

Non pensare al grafo

Hint 2:

Gli archi non ci interessano veramente. Considerando una persona, quali condizioni devono essere rispettate perché sia ripagato?


Sketch di soluzione:

Crea un array in cui ti salvi quanto ogni persona ha pagato/guadagnato. A quel punto fai le transizioni tra la prima e la seconda persona, la seconda e la terza e così via.


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

int main(){
  int n; cin >>n; int m; cin >> m;
  vector<int> vec(n);
  for(int i = 0; i<m; i++){
    int a, w, b;
    cin >> a >> b >> w;
    vec[a] -= w; vec[b] += w;
  }
  vector<array<int, 3>> sol(n-1);
  int cont = 0;
  for(int i = 0; i<n-1; i++){
    if(vec[i]) cont++;
    sol[i] = {i, i+1, abs(vec[i])};
    if(vec[i]<0) swap(sol[i][0], sol[i][1]);
    vec[i+1] += vec[i];
  }
  cout << cont << '\n';
  for(auto ar: sol){
    if(ar[2]==0) continue;
    cout << ar[0] << ' ' << ar[1] << ' ' << ar[2] << '\n';
  }
  return 0;
}   

Last Updated:
Contributors: nik-din