Codeforces Global Round 6 - D. Decreasing Debts(思维)
题意:有$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(思维)的更多相关文章
- Codeforces Global Round 1D(DP,思维)
#include<bits/stdc++.h>using namespace std;int dp[1000007][7][7];int cnt[1000007];int main(){ ...
- Codeforces Global Round 5E(构造,思维)
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;int main(){ ios::sync_w ...
- Codeforces Global Round 4E(字符串,思维)
#include<bits/stdc++.h>using namespace std;string s,a,b;int main(){ cin>>s; int n=s.size ...
- Codeforces Global Round 12 D. Rating Compression (思维,双指针)
题意:给你一长度为\(n\)的数组,有一长度为\(k\ (1\le k \le n)\)的区间不断从左往右扫过这个数组,总共扫\(n\)次,每次扫的区间长度\(k=i\),在扫的过程中,每次取当前区间 ...
- Codeforces Global Round 9 C. Element Extermination (思维,栈)
题意:有一个长度\(n\)的序列,如果\(a_{i}<a_{i+1}\),那么可以选择删除\(a_{i}\)或者\(a_{i+1}\),再继续操作,问是否能够将序列删到只剩一个元素. 题解:感觉 ...
- CodeForces Global Round 1
CodeForces Global Round 1 CF新的比赛呢(虽然没啥区别)!这种报名的人多的比赛涨分是真的快.... 所以就写下题解吧. A. Parity 太简单了,随便模拟一下就完了. B ...
- Codeforces Global Round 1 - D. Jongmah(动态规划)
Problem Codeforces Global Round 1 - D. Jongmah Time Limit: 3000 mSec Problem Description Input Out ...
- Codeforces Global Round 2 题解
Codeforces Global Round 2 题目链接:https://codeforces.com/contest/1119 A. Ilya and a Colorful Walk 题意: 给 ...
- Codeforces Global Round 1 (A-E题解)
Codeforces Global Round 1 题目链接:https://codeforces.com/contest/1110 A. Parity 题意: 给出{ak},b,k,判断a1*b^( ...
随机推荐
- phpstudy扩展mongoDB
观察如下3个参数,即位数,ts/nts,vc9/vc11/……三条规则(一定要一一对应) 重要是,还要对应PHP的版本,我选的是5.6的对应的版本 去http://windows.php.net/do ...
- mysql基本约定与命名规范
一.约定 1.如无特殊需求,所有表使用innodb引擎 2.如无特殊需求,所有主键均为自增类型 3.如无特殊需求,所有字段均为NOT NULL,并给定默认值 4.所有字段均设置备注,枚举字段需要说明每 ...
- 445. 两数相加 II
Q: A: 这种题的用例是一定会搞一些很大的数的.long都会溢出,所以我们就不用尝试转数字做加法转链表的方法了.另外直接倒置两个链表再做加法的做法会改变原链表,题干也说了禁止改动原链表. 1.求两个 ...
- MySQL-THINKPHP 商城系统二 商品模块的展示
上回已经说到,商品被分为spu商品和sku商品 , ------------------------------------------------------------------------- ...
- Java实现Word/Pdf/TXT转html
引言: 最近公司在做一个教育培训学习及在线考试的项目,本人主要从事网络课程模块,主要做课程分类,课程,课件的创建及在线学习和统计的功能,因为课件涉及到多种类型,像视频,音频,图文,外部链接及文档类型. ...
- Docker - Deepin中docker不能启动容器,-d也无效
问题重现 1. 搭建mysql docker run -p 3306:3306 --name docker-mysql-5.7 -v $PWD/conf:/etc/mysql/conf.d -v $P ...
- AcWing STL初步学习
vector, 变长数组,倍增的思想 size() 返回元素个数 empty() 返回是否为空 clear() 清空 front()/back() push_back()/pop_back() beg ...
- 如何在项目中新建.gitignore文件
1. 在需要创建 .gitignore 文件的文件夹, 右键选择 Git Bash 进入命令行,进入项目所在目录. 2. 输入 touch .gitignore 在文件夹就生成了一个“.gitigno ...
- go之二进制协议gob和msgpack
文章引用自 二进制协议gob和msgpack介绍 本文主要介绍二进制协议gob及msgpack的基本使用. 最近在写一个gin框架的session服务时遇到了一个问题,Go语言中的json包在序列化空 ...
- Python 多任务(进程) day1(1)
进程和程序的关系: 通俗来讲程序是死的不变的,进程是活的改变的.一个程序在没运行之前是程序,运行之后是进程 程序是一种电脑能识别的2进制代码,当你一直运行程序的时候,会出现多个进程(相当于菜谱和菜,照 ...