2017日照夏令营 day2 t1 debt

xiaoxiao2021-02-28  92

题目大意: 小 G 有一群好朋友,他们经常互相借钱。假如说有三个好朋友 A,B,C。A 欠 B 20 元,B 欠 C 20 元,总债务规模为 20+20=40 元。小 G 是个追求简约的人,他觉得这样的债务太繁杂了。他认为,上面的债务可以完全等价为 A 欠 C 20 元,B 既不欠别人,别人也不欠他。这样总债务规模就压缩到了 20 元。 现在给定 n 个人和 m 条债务关系。小 G 想找到一种新的债务方案,使得每个 人欠钱的总数不变,或被欠钱的总数不变(但是对象可以发生变化),并且使得总债务规模最小。

解题思路: 第一遍做的时候硬是没看懂题目,以为要用奇奇怪怪的方法。没想到题解这么简单。。。 其实就是个简单的模拟呀,如果a欠b c元,用数组存下a欠的钱数,即A[a]+=c;同样b也少欠c元,A[b]-=c; 最后再把A[]>0的加起来就OK了。

#include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <iostream> using namespace std; const int max_n = 1e6 + 10; const int max_m = 1e6 + 10; int a[max_n]; inline int read();//复习一下快速读入 { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } int main() { // freopen("debt.in", "r", stdin); // freopen("debt.out", "w", stdout); int n=read(); int m=read(); for (int i=1;i<=m;i++) { int u,v,w; u=read();v=read();w=read(); a[u]+=w;a[v]-=w; } int ans=0; for (int i=1;i<=n;i++) if (a[i]>0) ans+=a[i]; cout <<ans<<endl; }
转载请注明原文地址: https://www.6miu.com/read-83776.html

最新回复(0)