UVA 538 - Balancing Bank Accounts(贪心)

UVA 538 - Balancing Bank Accounts

题目链接

题意:给定一些人的欠钱关系,要求在n-1次内还清钱,问方案

思路:贪心,处理出每一个人最后钱的状态,然后直接每一个人都和最后一个人操作就可以

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <map>
using namespace std;

const int N = 25;

int n, m, have[N];
map<string, int> hash;
string name[N];

int main() {
	int cas = 0;
	while (~scanf("%d%d", &n, &m) && n || m) {
		hash.clear();
		memset(have, 0, sizeof(have));
		for (int i = 1; i <= n; i++) {
			cin >> name[i];
			hash[name[i]] = i;
		}
		string a, b; int val;
		while (m--) {
			cin >> a >> b >> val;
			int u = hash[a], v = hash[b];
			have[u] += val;
			have[v] -= val;
		}
		printf("Case #%d\n", ++cas);
		for (int i = 1; i < n; i++) {
			if (have[i] < 0)
				cout << name[i] << " " << name[n] << " " << -have[i] << endl;
			else if (have[i] > 0)
				cout << name[n] << " " << name[i] << " " << have[i] << endl;
			have[n] -= have[i];
		}
		printf("\n");
	}
	return 0;
}
时间: 2024-10-14 02:59:21

UVA 538 - Balancing Bank Accounts(贪心)的相关文章

UVA 538 - Balancing Bank Accounts

题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=599&problem=479&mosmsg=Submission+received+with+ID+14105881 题意: 给定一些人的欠钱关系,要求在n-1次内还清钱,问方案 解法:所有人与第n个人结账.计算关系. 代码: #include <stdi

uva 1521 - GCD Guessing Game(贪心)

题目链接:uva 1521 - GCD Guessing Game 题目大意:给定一个数N,现在又一个数x,在1~N之间,现在每次可以猜一个数a,返回gcd(x,a),问说最少猜几次可以确定x. 解题思路:其实就将1~N里面的素数都要考虑一遍,因为有一个N的限制,所以每次选出来的素数的积不大于N即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const

uva 10026 Shoemaker&#39;s Problem(贪心+排序)

虽然是个水题,但是在一些细节上wa了几次,好像不支持'\b'退格符号,我用在了输出空格那,结果wa了...白白 wa了几次...题意是看的题解..今天只写了两道题,速度有点慢,得加快了,以后得先认真读懂题目,题目读懂了 就相当于做出来一半然后仔细动脑想想,有想法了再敲,不能盲目的做题.另外,热烈祝贺今天c++ primer看到 了100页 思路: 这道题是让给的数据是每件工作需要做的天数和每耽误一天所需要的费用,让求一个序列使得付费最小,如果有相同答 案把字典树最小的输出...输出的是序号,该件

uva 1016 - Silly Sort(置换+贪心)

题目链接:uva 1016 - Silly Sort 题目大意:给定一个长度为n的序列,每次操作可以交换任意两个数的位置,代价为两个数的和,求最小代价,将序列排成有序的. 解题思路:给定序列根据数的大小映射成一个置换,分解置换的循环,对于每个循环中,肯定是用值最小的逐个去交换的代价最小,但是要考虑,可以将最小的值与序列中最小值交换,用它代替去交换,最后再换回来.取两种情况中最优的. #include <cstdio> #include <cstring> #include <

uva 714 - Copying Books(贪心 最大值最小化 二分)

题目描述开头一大堆屁话,我还仔细看了半天..其实就最后2句管用.意思就是给出n本书然后要分成k份,每份总页数的最大值要最小.问你分配方案,如果最小值相同情况下有多种分配方案,输出前面份数小的,就像字典序输出从小到大一样的意思. 这里用到贪心的方法,定义f(x)为真的条件是满足x为最大值使n本书分成k份,那么就是求x的最小值.如何确定这个x就是用的二分法,x一定大于0小于所有值的合,不断的二分再判断是否成立,成立就取左半边,不成立说明太小了就取右半边,写的时候还是没有把二分法理解透彻,我还怕会丢失

uva:10670 - Work Reduction(贪心)

题目:10670 - Work Reduction 题目大意:给出n, m, L.n代表老板给的全部的paperworks的数量,m代表最终剩下的数量,L代表由这么多家公司需要你来计算最小的花费. 解题思路: 1.L家公司l行.每行由公司的名字 :A,B: A代表一份paperwork需要的money,B则代表帮你减少到总共的paperworks的数量一半要话费的money.注意这里是你手头上有的paperworks而不是老板要求你完成的数量,之前在这里卡了好久.还有减半不能导致最终的数量小于m

uva:10602 - Editor Nottoobad(贪心)

题目:10602 - Editor Nottoobad 题目大意:有一个机子它由press的动作还有copy和delete字符的动作.给一组字符串,问要输入这样的一组字符串,最少要执行的press动作. 解题思路:将这一组字符串按照ascall码排序后,这样前后两个字符串的相似度是比较高的.然后后一个字符串和前一个字符串相比,看有多少相同的可以copy,就只要统计一下不相同的字符个数.这题比较迷惑人的是题目一直说要求第一个字符串一定要先执行press动作,但是输出却可以任意给一种,不一定是要第一

UVA 1379 - Pitcher Rotation(DP + 贪心)

题目链接:1379 - Pitcher Rotation 题意:n个人,m个敌人,去比赛,有得分,n个人可以重复比,但是每次比完要休息4天,问最大得分 思路:dp[i][j][k][l][x] 表示第场比赛,前一天为j,两天为k,三天为l,四天为x,的最大得分,然后由于只有每个人5天就能用一次,所以对于每个人来说,只有得分前5的会被使用上,所以后4维状态只需要5^4,进行状态转移,不用比赛的情况分开考虑,还有这题内存有限,要用滚动数组优化不然会RE 代码: #include <stdio.h>

Alternative Accounts 贪心匹配

Alternative Accounts 贪心匹配 题意: 有n个账号,k场比赛(1 <= k <= 3),每场比赛有m个人参加,账号名分别为\(x_i\),一个人可以有多个账号,但是一个人只能用一个账号参加比赛,问最少有多少个人. 题解: (大佬教我的)同一场比赛的账号不能在同一个集合里,问最少用几个集合能把数装满,用cnt1,cnt2,cnt3分别记录只出现在第一,二,三场比赛的账号,用cnt12,cnt13,cnt23记录出现在第一二,一三,二三场比赛的账号,那么cnt1和cnt23可以