题意:有$n$个人,$m$个债务关系,$u_{i}$,$v_{i}$,$d_{i}$表示第$u_{i}个人$欠第$v_{i}$个人$d_{i}$块钱,现在你需要简化债务关系,使得债务总额最小。比如,$A$欠$B$十元,$B$欠$C$十五元,$C$欠$A$十元,此时总的债务为$10+15+10=35$,我们可以把债务关系简化为$B$欠$C$五元,那这样总的债务为$5$。

思路:其实每个人只关心自己借出或者借进了多少钱,所以求出每个人借出或者借进了多少钱,再将借进和借出的人分开,两两进行配对,确保每次配对总能消除一个人,比如求出$A$借出$6$元,$B$借进$2$元,$C$借进$4$元,第一次将$A$和$B$配对,消除$B$,此时相当于$A$只借出了$4$元,再将$A$与$C$配对消除$C$即可,因为每次配对都能消除一个人,所以求出来的债务总额也肯定最小。

#include <iostream>
#include <algorithm>
#include <cstdio> using namespace std; typedef long long ll; const int N = ; int n, m, rc, ru[N], rv[N];
int pu[N], pv[N], nu, nv;
ll d[N], rw[N]; int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
d[u] += (ll)w, d[v] -= (ll)w;
}
for (int i = ; i <= n; i++) {
if (d[i] > ) pu[++nu] = i;
if (d[i] < ) pv[++nv] = i;
}
int p1 = , p2 = ;
while (p1 <= nu && p2 <= nv) {
if (d[pu[p1]] > abs(d[pv[p2]])) {
rw[++rc]= abs(d[pv[p2]]);
d[pu[p1]] -= abs(d[pv[p2]]);
ru[rc] = pu[p1], rv[rc] = pv[p2];
p2++;
}
else if (d[pu[p1]] < abs(d[pv[p2]])) {
rw[++rc] = d[pu[p1]];
d[pv[p2]] += d[pu[p1]];
ru[rc] = pu[p1], rv[rc] = pv[p2];
p1++;
}
else {
rw[++rc] = d[pu[p1]];
d[pu[p1]] = d[pv[p2]] = ;
ru[rc] = pu[p1], rv[rc] = pv[p2];
p1++, p2++;
}
}
printf("%d\n", rc);
for (int i = ; i <= rc; i++) printf("%d %d %lld\n", ru[i], rv[i], rw[i]);
return ;
}

Codeforces Global Round 6 - D. Decreasing Debts(思维)的更多相关文章

  1. Codeforces Global Round 1D(DP,思维)

    #include<bits/stdc++.h>using namespace std;int dp[1000007][7][7];int cnt[1000007];int main(){  ...

  2. Codeforces Global Round 5E(构造,思维)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;int main(){ ios::sync_w ...

  3. Codeforces Global Round 4E(字符串,思维)

    #include<bits/stdc++.h>using namespace std;string s,a,b;int main(){ cin>>s; int n=s.size ...

  4. Codeforces Global Round 12 D. Rating Compression (思维,双指针)

    题意:给你一长度为\(n\)的数组,有一长度为\(k\ (1\le k \le n)\)的区间不断从左往右扫过这个数组,总共扫\(n\)次,每次扫的区间长度\(k=i\),在扫的过程中,每次取当前区间 ...

  5. Codeforces Global Round 9 C. Element Extermination (思维,栈)

    题意:有一个长度\(n\)的序列,如果\(a_{i}<a_{i+1}\),那么可以选择删除\(a_{i}\)或者\(a_{i+1}\),再继续操作,问是否能够将序列删到只剩一个元素. 题解:感觉 ...

  6. CodeForces Global Round 1

    CodeForces Global Round 1 CF新的比赛呢(虽然没啥区别)!这种报名的人多的比赛涨分是真的快.... 所以就写下题解吧. A. Parity 太简单了,随便模拟一下就完了. B ...

  7. Codeforces Global Round 1 - D. Jongmah(动态规划)

    Problem   Codeforces Global Round 1 - D. Jongmah Time Limit: 3000 mSec Problem Description Input Out ...

  8. Codeforces Global Round 2 题解

    Codeforces Global Round 2 题目链接:https://codeforces.com/contest/1119 A. Ilya and a Colorful Walk 题意: 给 ...

  9. Codeforces Global Round 1 (A-E题解)

    Codeforces Global Round 1 题目链接:https://codeforces.com/contest/1110 A. Parity 题意: 给出{ak},b,k,判断a1*b^( ...

随机推荐

  1. redis架构

    hash槽16384个,0-16383 master1(slave101,slave102)     master2  (slave201,slave202)    master 3 (slave30 ...

  2. Yum与list结合

    我用两台Linux LinuxA      IP:192.168.10.101 LinuxB      IP:192.168.10.102 首先我们在LinuxA上挂载光驱和安装FTP服务器 然后安装 ...

  3. 关于Excel,你一定用的到的36个Python函数

    从Excel到Python:最常用的36个Pandas函数关于Excel,你一定用的到的36个Python函数 本文涉及pandas最常用的36个函数,通过这些函数介绍如何完成数据生成和导入.数据清洗 ...

  4. 项目git的步骤,将项目托管到码云

    项目git的步骤 1.创建.gitignore文件,进行文件过滤.写着不需要上传到git仓库的文件夹名字 2.readme.md 3.拷贝LICENSE,开源协议 4.创建本地仓储 * 使用git i ...

  5. IntelliJ IDEA 2017.3尚硅谷-----设置界面

  6. 在VS2017中配置VLD(Visual Leak Detector)内存泄漏检测工具

    首先在官方下载VLD 下载地址: https://kinddragon.github.io/vld/ 此版本为V2.5.1,为最后发布版本,下载后安装.加入你的安装路径为:VLD_Path,后面会用到 ...

  7. js实现Set

    class MySet { constructor(params) { if (typeof params[Symbol.iterator] !== 'function') { throw new T ...

  8. new一个对象做了哪些操作

    网上其实有很多说new关键字做了哪些操作,读过之后就忘了,这里以自己的理解做一个简单的记录. function Naji () { this.skulk = function () { return ...

  9. 数据库程序接口——JDBC——API解读第一篇——建立连接的核心对象

    结构图 核心对象 Driver Java通过Driver接口表示驱动,每种类型的数据库通过实现Driver接口提供自己的Driver实现类. Driver由属性,操作,事件三部分组成. 属性 公共属性 ...

  10. IDEA 自定义注释模板 支持设置多个param参数

    在使用IDEA过程中,很多人可能感觉自带注释太简约了,想增加一些属性,比如作者.创建时间.版本号等等,这个时候我们可以使用自定义的注释模板来实现我们需求,话不多说直接进入如何自定义模板设置: 打开设置 ...