描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1021 三个人相互欠钱,给出他们每个人各种面额的钞票各有多少张,求最少需要传递多少张钞票才能把账还清. 分析 用\(f[i][j][k]\)表示用过前\(i\)种钞票后,A有\(j\)元,B有\(k\)元所需要的步数. 然后DP就好了. #include <bits/stdc++.h> using namespace std; +,INF=~; int sum,t; ],h[],g[],m[…
dp(i, j, k)表示考虑了前i种钱币(从小到大), Alice的钱数为j, Bob的钱数为k, 最小次数. 脑补一下可以发现, 只有A->B.C, B->A.C, C->A.B, A.B->C, A.C->B, B.C->A 6情况, 枚举然后dp一下就OK了. dp用刷表的话,有个强有力的剪枝是之后的硬币无论如何组合都无法满足时不去更新. --------------------------------------------------------------…
前天打了一场比赛,让我知道自己Dp有多弱了,伤心了一天,没刷bzoj. 昨天想了一天,虽然知道几何怎么搞,但我还是不敢写,让我知道自己几何有多弱了,伤心了一天,没刷bzoj 1021: [SHOI2008]Debt 循环的债务 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 685  Solved: 350[Submit][Status][Discuss] Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于…
1021: [SHOI2008]Debt 循环的债务 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 694  Solved: 356[Submit][Status][Discuss] Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务的时候尽可能少的交换现金.比如说,Alice欠Bob 10元,而Cyn…
http://www.lydsy.com/JudgeOnline/problem.php?id=1021 如果A收到了B的1张10元,那么A绝对不会把这张10元再给C 因为这样不如B直接给C优 由此可以推出 若A欠B20元,B欠C 30元, 那么A还C20元,B还C10元最优 所以一共只有 A->BC   B->AC  C->AB AB->C  BC->A  AC->B 这6种转移情况 根据输入,我们可以知道三人最终手中有多少钱ea.eb.ec,一共有多少钱sum 设f…
Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务的时候尽可能少的交换现金.比如说,Alice欠Bob 10元,而Cynthia和他俩互不相欠.现在假设Alice只有一张50元,Bob有3张10元和10张1元,Cynthia有3张20元.一种比较直接的做法是:Alice将50元交给Bob,而Bob将他身上的钱找给Alice,这样一共就会有14张钞票被…
Description Alice. Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他 们决定要在清还债务的时候尽可能少的交换现金.比如说,Alice欠Bob 10元,而Cynthia和他俩互不相欠.现在假设Alice只有一张50元,Bob有3张10元和10张1元,Cynthia有3张20元.一种比较直 接的做法是:Alice将50元交给Bob,而Bob将他身上的钱找给Alice,这样一共就会有14张…
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1021 [题意] [题解] 设f[i][j][k]表示前i种面值的钱币; 第一个人当前的钱数为j,第二个人当前的钱数为k; 所需要的最小交换钱币次数; 这里第三个人的钱数就是sum-j-k; 然后我们以钱币的种类划分成6个阶段进行这样的DP; (这里我们可以一开始通过a,b,c处理出最后第一个人该有多少钱.第二个人该有多少钱-) DP的依据就是; 同一种类的钱币; 只要确定了某个人要增…
DP 去膜拜题解了>_>玛雅原来是动规…… 让我先理解一下为什么要用动规:这个题根据钱数推方案其实是无从下手的……(线性规划?……事实证明我想多了) 啦-我们先来看个超级简化版的问题:怎么判无法还清?正着判很麻烦对不对= =(其实是我没想……) 那么我们倒着来考虑:有哪些状态是我们通过交换钱币能够到达的,这个可以递推对不>_> 现在我们就知道哪些状态我们是可以到达的了……再多想一下……递推……如果我们依次考虑每种面额的交换策略,顺便也就知道了我们到达这个状态的最小交换次数对吧? 原…
[BZOJ1021][SHOI2008]循环的债务(动态规划) 题面 BZOJ 洛谷 题解 感觉以前的题目都好小清新啊,我这种智商丢失的选手完全写不动. 这题看着就像一个\(dp\),并且我们发现每种币值之间是独立的,而且起始状态和终止状态同样已知. 设\(f[i][j][k]\)表示只交换前\(i\)种币值的情况下,第一个人拥有\(j\)元,第二个人拥有\(k\)元时的最小交换次数.抓住不变量是钱的总和不变,所以第三个人手中拥有的钱的总和就是三个人的总和减去前两个人的钱的总和.每次两重循环枚举…
CSP-2020倒计时:36天 [SHOI2008]JZOJ2020年9月5日提高组 循环的债务 题目 Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务的时候尽可能少的交换现金. 比如说,Alice欠Bob 10元,而Cynthia和他俩互不相欠.现在假设Alice只有一张50元,Bob有3张10元和10张1元,Cynthia有3张20元.一种比较…
传送门 吐槽洛谷难度标签qwq Solution 显然是一道神奇的DP,由于总钱数不变,我们只需要枚举前两个人的钱数就可知第三个人的钱数 DP的时候先枚举只用前k个币种,然后枚举前两个人的钱数,然后枚举转移即可 Code #include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorith…
题目链接 不同面额的钞票是可以分开考虑的. ↑其实并不很明白具体(证明?),反正是可以像背包一样去做. f[x][i][j]表示用前x种面额钞票满足 A有i元 B有j元 (C有sum-i-j)所需交换的最少数量(=(abs(ΔA)+abs(ΔB)+abs(ΔA+ΔB))/2). (i,j是在本来就有的钞票的基础上的,因为初始得是f[0][sa][sb]=0,这样转移后的价格是根据差值变的) 转移时枚举i,j,再枚举最终A有a张x面值钞票,B有b张x面值钞票 (据此可以算出要交换的钞票数). 复杂…
题面描述 \(Alice\).\(Bob\)和\(Cynthia\)总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务的时候尽可能少的交换现金.比如说,\(Alice\)欠\(Bob\) \(10\)元,而\(Cynthia\)和他俩互不相欠.现在假设\(Alice\)只有一张\(50\)元,\(Bob\)有\(3\)张\(10\)元和\(10\)张\(1\)元,\(Cynthia\)有\(3\)张\(20…
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1019 汉诺塔游戏,但是有移动优先级,在不违反原有规则的情况下,给定优先移动目标.求完成游戏所需的步数. 分析 我们用\(f[j][i]\)表示把第\(j\)个柱子上的最上面\(i\)个盘子移走所需的步数,用\(g[j][i]\)表示会移动到哪个柱子上. 那么对于\(f[j][i]\),首先把前\(i-1\)个移出去,步数为\(f[j][i-1]\),记移到了柱子\(y\),这时候再把第\(i…
Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题. 不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务的时候尽可能少的交换现金.比如说,Al ice欠Bob 10元,而Cynthia和他俩互不相欠.现在假设Alice只有一张50元,Bob有3张10元和10张1元,Cynthia有3 张20元.一种比较直接的做法是:Alice将50元交给Bob,而Bob将他身上的钱找给Alice,这样一共就会有14张…
水水的dp 设f[i][a][b]表示交换完前i种面值的钞票,第一个人有a元,第二个人有b元的最小代价 直接转移就行了 需要注意的是算的式子 第1个人\(\Delta A\),第二个人\(\Delta B\),最小交换代价是\((|\Delta A|+|\Delta B|+|\Delta A+\Delta B|)/2\)…
Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题. 不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务的时候尽可能少的交换现金.比如说,Al ice欠Bob 10元,而Cynthia和他俩互不相欠.现在假设Alice只有一张50元,Bob有3张10元和10张1元,Cynthia有3 张20元.一种比较直接的做法是:Alice将50元交给Bob,而Bob将他身上的钱找给Alice,这样一共就会有14张…
dp模拟即可. d[i][j][k]表示使用前i种面值,1号手里钱为j,2号手里钱为k时最少操作数 使用滚动数组压缩空间 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ; ; , , , , , }; int x1, x2, x3; int now, tot; int suma, sumb, dis; ], Cnt[n]; ][M][M], cnt[][n];…
Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务的时候尽可能少的交换现金.比如说,Alice欠Bob 10元,而Cynthia和他俩互不相欠.现在假设Alice只有一张50元,Bob有3张10元和10张1元,Cynthia有3张20元.一种比较直接的做法是:Alice将50元交给Bob,而Bob将他身上的钱找给Alice,这样一共就会有14张钞票被…
Description 题库链接 A 欠 B \(x_1\) 元, B 欠 C \(x_2\) 元, C 欠 A \(x_3\) 元.现每人手上各有若干张 100,50,20,10,5,1 钞票.问至少交换几张钞票才能互相还清债务. \(1\leq |x_1|,|x_2|,|x_3|\leq 1000\) ,总钱数 \(\leq 1000\) Solution 考虑 \(DP\) . 记 \(f_{i,j,k}\) 为当前考虑第 \(i\) 张钞票转移, A 有 \(j\) 元, B 有 \(k…
题目大意 有 \(M\) 个球,一开始每个球均有一个初始标号,标号范围为 \(1\) - \(N\) 且为整数,标号为 \(i\) 的球有 \(a_i\) 个,并保证 \(\sum a_i = M\). 每次操作等概率取出一个球(即取出每个球的概率均为 \(1\over M\)),若这个球标号为 \(k\ (k < N)\),则将它重新标号为 \(k+1\):若这个球标号为 \(N\),则将其重标号为 \(1\).(取出球后并不将其丢弃) 现在你需要求出,经过 \(K\) 次这样的操作后,每个标…
习题2-1 位数 输入一个不超过109的正整数,输出它的位数.例如12735的位数是5.请不要使用任何数学函数,只用四则运算和循环语句实现. #include<stdio.h> int main(void) { int n; ; scanf("%d",&n); while(n) { n = n / ; digit++; } printf("%d\n", digit); ; } 习题2-2 水仙花数 输出100~999中的所有水仙花数.若3位数AB…
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1616 给出一张图,有些点不能走,给出起始点和结束点,以及时间,求在该时间到达结束点的方案数. 分析 直接DP即可. \(f[i][j][k]\)表示在\(i\)时间走到\((j,k)\)的方案数. 在\(i\)时间从点\((a,b)\)走到\((c,d)\): \(f[i][c][d]+=f[i-1][a][b]\). #include <bits/stdc++.h> using name…
今日内容介绍 1.集合 2.Iterator迭代器 3.增强for循环 4.泛型 01集合使用的回顾 *A:集合使用的回顾 *a.ArrayList集合存储5个int类型元素 public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<Integer>(); list.add(111); list.add(222); list.add(333); list.add(444); li…
题目 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌 图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例来说,上面的第一个例子是一张仙人图,而第二个不是--注意到它有三条简单回路:(4,3,2,1,6 ,5,4).(7,8,9,10,2,3,7)以及(4,3,7,8,9,10,2,1,6,5,4),而(2,3)同时出现在前两 个的简单回路里.另外,第三张图也不是仙人图,因为它并不是连通图.显然,仙人图上的…
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 第六天_for循环的嵌套 { class Program { static void Main(string[] args) { int num01; int num02; ; num01 <= ; num01++) { ; num02 <= n…
本来想先求出点双再一个一个处理结果写了很长发现太麻烦 设f[u]为u点向下的最长链 就是再tarjan的过程中,先照常处理,用最长儿子链和次长儿子链更新按ans,然后处理以这个点为根的环,也就是这个点是dfs第一次到这个环访问到的点 环用来更新ans的是儿子链+到根的一段,这个直接for一边就行,还有就是一个儿子链+环上的一段+另一个儿子链,这个把环复制一遍然后单调队列扫即可 注意距离的定义是最短距离! #include<iostream> #include<cstdio> usi…
我实在是太弱了...不滚粗只能刷BZOJ了...这里来记录每天刷了什么题吧. 2015-7-9 : 1001[BeiJing2006]狼抓兔子                 | 最大流练习(呃..其实是平面图最大流辣) 1002[FJOI2007]轮状病毒                     | 基尔霍夫矩阵算生成树数量(呃..其实是DP辣) 2015-7-10: 1003[ZJOI2006]物流运输trans             | SPFA+DP 2015-7-11: 1004[H…
BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2007]轮状病毒:找规律 + 高精: [BZOJ1003][ZJOI2006]物流运输:最短路 + DP: [BZOJ1004][HNOI2008]Cards:Burnside 引理 + DP: [BZOJ1005][HNOI2008]明明的烦恼:prufer编码 + 高精: [BZOJ1007][…