首页 > 其他分享 >1027. 最优账单平衡(待完善)-dfs

1027. 最优账单平衡(待完善)-dfs

时间:2023-11-30 17:35:55浏览次数:33  
标签:1027 return 账单 int fmt debts dfs start input

题目描述

一群朋友在度假期间会相互借钱。比如说,小爱同学支付了小新同学的午餐共计 10 美元。如果小明同学支付了小爱同学的出租车钱共计 5 美元。我们可以用一个三元组 (x, y, z) 表示一次交易,表示 x 借给 y 共计 z 美元。用 0, 1, 2 表示小爱同学、小新同学和小明同学(0, 1, 2 为人的标号),上述交易可以表示为 [[0, 1, 10], [2, 0, 5]]。

给定一群人之间的交易信息列表,计算能够还清所有债务的最小次数。

注意:

一次交易会以三元组 (x, y, z) 表示,并有 x ≠ y 且 z > 0。
人的标号可能不是按顺序的,例如标号可能为 0, 1, 2 也可能为 0, 2, 6。

示例 1:

输入:
2
0 1 10
2 0 5

输出:
2

解释:
人 #0 给人 #1 共计 10 美元。
人 #2 给人 #0 共计 5 美元。

需要两次交易。一种方式是人 #1 分别给人 #0 和人 #2 各 5 美元。

示例 2:

输入:
4
0 1 10
1 0 1
1 2 5
2 0 5

输出:
1

解释:
人 #0 给人 #1 共计 10 美元。Person #0 gave person #1 $10.
人 #1 给人 #0 共计 1 美元。Person #1 gave person #0 $1.
人 #1 给人 #2 共计 5 美元。Person #1 gave person #2 $5.
人 #2 给人 #0 共计 5 美元。Person #2 gave person #0 $5.

因此,人 #1 需要给人 #0 共计 4 美元,所有的债务即可还清。

 

 

package main

import "fmt"

func main() {
    var n, x, y, z int
    m := make(map[int]int)
    fmt.Scan(&n)
    for n > 0 {
        fmt.Scan(&x, &y, &z)
        m[x] += z
        if m[x] == 0 {
            delete(m, x)
        }
        m[y] -= z
        if m[y] == 0 {
            delete(m, y)
        }
        n--
    }
    fmt.Println(len(m) - 1)
}

  

 

解答要求时间限制:1000ms, 内存限制:64MB 输入

第一行为三元组个数,之后每一行为一个三元组,三元组成员间以空格分隔

输出

输出能够还清所有债务的最小次数

样例

输入样例 1 复制

2
0 1 10
2 0 5

输出样例 1

2

 

 

分析:

刚开始所有人债务为0,然后每输入一行,更新2个人的总债务数,最后把总债务数为0的剔除,看还剩多少人。

代码:(40%用例通过)

 

分析:

我这里求出了一共有m个人的债务总数不为0,输出的是m-1

实际上应该进一步求出,这m个数,最多可以分为多少组,使得每一组的总和都为0,假设k组,输出m-k

对于有的用例k=1,但是有的用例k>1

如何求k,待完善。

 

 

package main

import "fmt"

func minTransfers(transactions [][]int) int {
	balances := make(map[int]int)
	for _, t := range transactions {
		balances[t[0]] -= t[2]
		balances[t[1]] += t[2]
	}
	debts := []int{}
	for _, v := range balances {
		if v != 0 {
			debts = append(debts, v)
		}
	}
	return settleDebts(debts, 0)
}

func settleDebts(debts []int, start int) int {
	for start < len(debts) && debts[start] == 0 {
		start++
	}
	if start == len(debts) {
		return 0
	}
	minTrans := int(^uint(0) >> 1)
	for i := start + 1; i < len(debts); i++ {
		if debts[i]*debts[start] < 0 {
			debts[i] += debts[start]
			minTrans = min(minTrans, 1+settleDebts(debts, start+1))
			debts[i] -= debts[start]
		}
	}
	return minTrans
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func main() {
	transactions := [][]int{{0, 1, 10}, {2, 0, 5}}
	fmt.Println(minTransfers(transactions))
}

  

 

 

 

package main

import "fmt"

var input [100]int
var result = int(^uint(0) >> 1)

/**
1.递归写法,每次递归返回后,需要清除上一步的操作;
2.for循环里面嵌套递归;
3.我的代码是预置了100人,人数这里还需要优化下。
*/

func main() {
	var len int
	fmt.Scan(&len)
	for len > 0 {
		var x, y, z int
		fmt.Scan(&x, &y, &z)
		input[y] += z
		input[x] -= z
		len--
	}
	res := dfs(0, 0)
	fmt.Print(res)
}

func dfs(start, num int) int {
	for start < 100 && input[start] == 0 {
		start++
	}
	if start == 100 {
		result = min(result, num)
	}
	for i := start + 1; i < 100; i++ {
		if (input[i] < 0 && input[start] > 0) || (input[i] > 0 && input[start] < 0) {
			input[i] += input[start]
			result = min(result, dfs(start+1, num+1))
			input[i] -= input[start]
		}
	}
	return result
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

  

标签:1027,return,账单,int,fmt,debts,dfs,start,input
From: https://www.cnblogs.com/gongxianjin/p/17867880.html

相关文章

  • 【DFS深度优先遍历】给定一个数组,从第一个开始,正好走到数组最后,所使用的最少步骤数
    题目描述给定一个数组,从第一个开始,正好走到数组最后,所使用的最少步骤数。要求:第一步从第一元素开始,第一步小于<len/2(len为数组的长度)。从第二步开始,只能以所在成员的数字走相应的步数,不能多也不能少,如果目标不可达返回-1,输出最少的步骤数,不能往回走。输入759426835......
  • 分布式系统HDFS
    1、完全分布式搭建hadoop102[namenode,datanode],hadoop103[datanode],hadoop104[secondarynamenode,datanode]缺少104,配置104选择完全克隆103机器的名称hadoop104配置机器的IP192.168.18.104修改vim /etc/sysconfig/network-scripts/ifcfg-ens33重启⽹络......
  • 【DFS深度优先算法】全排列、组合总和
    全排列题目描述:给定一个没有重复数字的序列,返回其所有可能的全排列。题目链接:46.全排列输入描述:输入:[1,2,3]输出描述:输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]思路:依次从前往后把所有数字,固定在第0个位置,此时再从前往后把剩余数字依次固定在第1个位置,如此......
  • 二、HDFS的读写流程
    一、写数据(宏观)  写数据就是将客户端上的数据上传到HDFS 1.客户端向HDFS发送写数据请求 hdfsdfs-putstudents.txt/shujia/ 2.Filesystem通过rpc调用namenode的put方法 a.nn首先检查是否有足够的空间权限等条件创建这个文件,或者这个路径是否已经存在,权限......
  • Hadoop三大组件(HDFS,MapReduce,Yarn)
    1、HDFSHDFS是Hadoop分布式文件系统。一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。2、MapReduceMapReduce是一个软件框架,基于该框架能够容易地编写应用......
  • 百战商城项目---第11章 文件服务器 FastDFS 搭建
    1简介FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS为互联网量身定制,充分考虑了冗余备份......
  • DFS算法的非递归遍历分析
    两种写法,一个是边表顶点号全部压栈,一个是类似后序非递归遍历1、voidDFS(GraphG,inti){intp,w;StackS;InitStack(S);Push(S,i);visited[i]=true;while(!isEmpty(S)){Pop(S,p);printf("%d",G.Ver[p].num);......
  • Weblogic < 10.3.6 'wls-wsat' XMLDecoder 反序列化漏洞(CVE-2017-10271)
    Weblogic<10.3.6'wls-wsat'XMLDecoder反序列化漏洞(CVE-2017-10271)Weblogic的WLSSecurity组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。环境搭建cdweblogic/CVE-2017-10271docker-compose......
  • Linux安装fastdfs图片服务器
    1、阿里云安装centos7服务器得到用户名密码和ip后用securCrt连接工具链接远程主机2、安装fastdfs图片服务器(1)上传需要的压缩包libfastcommon-common.zip(依赖工具包)  FastDFS_v5.05.tar.gz(源码)  fastdfs-nginx-module_v1.16.tar.gz(与nginx连接的模块)nginx1.8版本  ......
  • DFS序和欧拉序的降维打击
    1.DFS序和时间戳1.1DFS序定义:树的每一个节点在深度优先遍历中进、出栈的时间序列。如下树的dfs序就是[1,2,8,8,5,5,2,4,3,9,9,3,6,6,4,7,7,1]。下图为生成DFS的过程。对于一棵树进行DFS序,除了进入当前节点时对此节点进行记录,同时在回溯到当前节点时对其也记录一下,所以DF......