[SHOI 2008]Debt 循环的债务
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\) 元, C 有 \(sum-j-k\) 元。其中 \(sum\) 为三人拥有钞票价值总和。
第 \(i\) 张转移的时候就考虑分钱后每人各有多少张 \(i\) 种钞票。记得去掉不合法的情况。先从钞票面值大到小转移状态会少些。
Code
//It is made by Awson on 2018.2.27
#include <bits/stdc++.h>
#define LL long long
#define dob complex<double>
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = 1000, w[7] = {0, 100, 50, 20, 10, 5, 1};
void read(int &x) {
char ch; bool flag = 0;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || 1); ch = getchar());
for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar());
x *= 1-2*flag;
}
void print(int x) {if (x > 9) print(x/10); putchar(x%10+48); }
void write(int x) {if (x < 0) putchar('-'); print(Abs(x)); }
int x1, x2, x3, sum, INF;
int a[5][7], cnt[7], tol[5], f[8][N+5][N+5];
void work() {
read(x1), read(x2), read(x3);
for (int i = 1; i <= 3; i++) for (int j = 1; j <= 6; j++) read(a[i][j]), cnt[j] += a[i][j], tol[i] += a[i][j]*w[j];
sum += tol[1]+tol[2]+tol[3];
memset(f, 127/3, sizeof(f)); INF = f[0][0][0]; f[1][tol[1]][tol[2]] = 0;
for (int i = 1; i <= 6; i++)
for (int j = 0; j <= sum; j++)
for (int k = 0; k+j <= sum; k++) {
if (f[i][j][k] == INF) continue;
for (int p = 0; p <= cnt[i]; p++)
for (int q = 0; p+q <= cnt[i]; q++) {
int p1 = j+(p-a[1][i])*w[i], p2 = k+(q-a[2][i])*w[i], p3 = sum-tol[1]-tol[2]+(cnt[i]-p-q-a[3][i])*w[i];
if (p1 < 0 || p2 < 0 || p3 < 0) continue;
if (f[i+1][p1][p2] > f[i][j][k]+(Abs(p-a[1][i])+Abs(q-a[2][i])+Abs(cnt[i]-p-q-a[3][i]))/2)
f[i+1][p1][p2] = f[i][j][k]+(Abs(p-a[1][i])+Abs(q-a[2][i])+Abs(cnt[i]-p-q-a[3][i]))/2;
}
}
tol[1] -= x1, tol[2] += x1;
tol[2] -= x2, tol[3] += x2;
tol[3] -= x3, tol[1] += x3;
if (tol[1] < 0 || tol[2] < 0 || tol[3] <0 || f[7][tol[1]][tol[2]] == INF) puts("impossible");
else writeln(f[7][tol[1]][tol[2]]);
}
int main() {
work(); return 0;
}
[SHOI 2008]Debt 循环的债务的更多相关文章
- bzoj1021 [SHOI2008]Debt 循环的债务
前天打了一场比赛,让我知道自己Dp有多弱了,伤心了一天,没刷bzoj. 昨天想了一天,虽然知道几何怎么搞,但我还是不敢写,让我知道自己几何有多弱了,伤心了一天,没刷bzoj 1021: [SHOI20 ...
- BZOJ 1021 [SHOI2008]Debt 循环的债务
1021: [SHOI2008]Debt 循环的债务 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 694 Solved: 356[Submit][S ...
- BZOJ 1021: [SHOI2008]Debt 循环的债务( dp )
dp(i, j, k)表示考虑了前i种钱币(从小到大), Alice的钱数为j, Bob的钱数为k, 最小次数. 脑补一下可以发现, 只有A->B.C, B->A.C, C->A.B ...
- bzoj千题计划111:bzoj1021: [SHOI2008]Debt 循环的债务
http://www.lydsy.com/JudgeOnline/problem.php?id=1021 如果A收到了B的1张10元,那么A绝对不会把这张10元再给C 因为这样不如B直接给C优 由此可 ...
- 1021: [SHOI2008]Debt 循环的债务 - BZOJ
Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务的 ...
- [bzoj1021][SHOI2008]Debt 循环的债务 (动态规划)
Description Alice. Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他 们决定要在清还债 ...
- $bzoj1021-SHOI2008\ Debt$ 循环的债务 $dp$
题面描述 \(Alice\).\(Bob\)和\(Cynthia\)总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在 ...
- 【BZOJ 1021】[SHOI2008]Debt 循环的债务
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1021 [题意] [题解] 设f[i][j][k]表示前i种面值的钱币; 第一个人当前的 ...
- 【BZOJ】【1021】【SHOI2008】Dept循环的债务
DP 去膜拜题解了>_>玛雅原来是动规…… 让我先理解一下为什么要用动规:这个题根据钱数推方案其实是无从下手的……(线性规划?……事实证明我想多了) 啦-我们先来看个超级简化版的问题:怎么 ...
随机推荐
- RPC原理解析
1.RPC原理解析 1.1 什么是RPC RPC(Remote Procedure Call Protocol) --远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络 ...
- 小黄衫 Get
小黄衫 Get . 十分荣幸在前四次作业中以微弱的3分之差拿到了第一,获得了本次的小黄衫. 先发点牢骚.. 讲道理,原本以为的研究生生涯应该就是埋在论文堆里度过的时候顺便上上课.当初选课的时候,学 ...
- 项目Beta冲刺Day7
项目进展 李明皇 今天解决的进度 部分数据传递和使用逻辑测试 林翔 今天解决的进度 服务器端查看个人发布的action,修改已发布消息状态的action,仍在尝试使用第三方云存储功能保存图片 孙敏铭 ...
- easyUI combobox 添加空白项
今天测试反馈了一个问题,希望可以在下拉框下面加一个空白的选项(下拉框用的是combobox方法). 开始分析这个问题: 首先,这个数据都是后台读出来的,那么我在后台直接添加可以么,答案是可以的,如果没 ...
- 不看就亏了:DELL EqualLogic PS6100详解及数据恢办法
DELL EqualLogic PS6100采用虚拟ISCSI SAN阵列,为远程或分支办公室.部门和中小企业存储部署带来企业级功能.智能化.自动化和可靠性,支持VMware.Solaris.Linu ...
- 再议Python协程——从yield到asyncio
协程,英文名Coroutine.前面介绍Python的多线程,以及用多线程实现并发(参见这篇文章[浅析Python多线程]),今天介绍的协程也是常用的并发手段.本篇主要内容包含:协程的基本概念.协程库 ...
- STM32常见问题
一.STM32 下不了程序 提示: (1).JLink Info: CPU halted Erase Done. Programming Failed! 解决办法: 用isp把芯片全部擦除再试试,如果 ...
- awk sed tr替换换行符为逗号,并合并为一行
在群里看到的.记录以备用. sed 帮助命令:http://man.linuxde.net/sed 文件里有如下行,我想将每行的回车符替换为逗号,并将所有行合并到一行,用awk或sed怎么写啊TOP ...
- Linq GroupJoin
static void Main(string[] args) { List<Person> persons = new List<Person> { }, }, }; Lis ...
- 开源软件:NoSql数据库 - 图数据库 Cassandra
转载原文:http://www.cnblogs.com/loveis715/p/5299495.html Cassandra简介 在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了 ...