多米诺骨牌

Codeforces Round #588 (Div. 2)

£可爱£侵袭症+ 提交于 2020-04-07 00:31:27
题目链接: https://codeforces.com/contest/1230 A - Dawid and Bags of Candies 随便弄一下。 B - Ania and Minimizing 随便弄一下。 C - Anadi and Domino 看到这个题目意识到我好像做过这套题。 那么好像我是看过题解的,但是我没有补。 题意:给21种多米诺骨牌,以及不超过7个点的一个简单图,把多米诺骨牌放在边上,使得图的点对应多米诺骨牌的颜色。求最多能放多少个骨牌? 题解:多米诺骨牌的6种颜色是完全等价的,所以n<=6的时候每个点就染一种颜色即可。否则枚举7号点的颜色,然后贪心放就可以。 int edge[8][8]; int used[8][8]; void TestCase() { for(int i = 1; i <= 6; ++i) { for(int j = 1; j <= 6; ++j) edge[i][j] = 0; } int n, m; scanf("%d%d", &n, &m); for(int i = 1; i <= m; ++i) { int u, v; scanf("%d%d", &u, &v); edge[u][v] = 1; edge[v][u] = 1; } if(n <= 6) { printf("%d\n", m); return; } for

UOJ422 小Z的礼物

本小妞迷上赌 提交于 2020-03-02 22:23:28
小Z的礼物 小Z有一个神奇的自动售货机,里面有 \(n \times m\) 种物品,分别放在 \(n\) 行 \(m\) 列个格子中。每当小Z向自动售货机中投入一枚硬币,他就能获得一对相邻格子中的物品(已经获得的物品可能再次获得),获得每一对相邻格子中的物品的概率是相等的。在这 \(n \times m\) 种物品中,有一些物品是小Z喜欢的(小Z喜欢的用 * [星号] 表示,其他的用 .[英文句号] 表示),他想把这些物品包装成一份礼物。小Z想知道,期望投入多少枚硬币后,就可以获得这些他喜欢的物品。 对于所有数据,保证 \(1 \leq n \leq 6, 2 \leq m \leq 100\) 。 题解 一眼就能看出是min-max容斥。 \[ \sum_{T\subseteq S}(-1)^{|T|+1}\frac{all}{F(T)} \] 其中 \(all=n(m-1)+m(n-1)\) 表示多米诺骨牌总数。 \(F(T)\) 表示能覆盖 \(T\) 中至少一个点的多米诺骨牌数量。 考虑设计DP求出所有 \(F(T)=x\) 的 \(T\) 的容斥系数 \((-1)^{|T|+1}\) 和。向 \(T\) 中加入一个星号时可以向四周摆放多米诺骨牌,两个相邻的星号会算重,所以我们需要用状压记录选择情况。 设 \(dp(i,j,S,T,x)\) 表示做到格子 \((i,j)\

LeetCode:1007. 行相等的最少多米诺旋转

孤者浪人 提交于 2020-01-18 03:57:35
在一排多米诺骨牌中, A[i] 和 B[i] 分别代表第 i 个多米诺骨牌的上半部分和下半部分。(一个多米诺是两个从 1 到 6 的数字同列平铺形成的 —— 该平铺的每一半上都有一个数字。) 我们可以旋转第 i 张多米诺,使得 A[i] 和 B[i] 的值交换。 返回能使 A 中所有值或者 B 中所有值都相同的最小旋转次数。 如果无法做到,返回 -1 . 示例 1: 输入: A = [2,1,2,4,2,2], B = [5,2,6,2,3,2] 输出: 2 解释: 图一表示:在我们旋转之前, A 和 B 给出的多米诺牌。 如果我们旋转第二个和第四个多米诺骨牌,我们可以使上面一行中的每个值都等于 2,如图二所示。 示例 2: 输入: A = [3,5,1,2,3], B = [3,6,3,3,4] 输出: -1 解释: 在这种情况下,不可能旋转多米诺牌使一行的值相等。 提示: 1 <= A[i], B[i] <= 6 2 <= A.length == B.length <= 20000 C++代码 class Solution { public: int minDominoRotations(vector<int>& A, vector<int>& B) { int a=A[0], b=B[0]; int n=A.size(); for(int i=1;i<n;i++){ if(a

#(抽象背包的转化)洛谷P1282 多米诺骨牌(提高+/省选-)

匿名 (未验证) 提交于 2019-12-02 23:55:01
题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点。现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|。例如在图8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2。每个多米诺骨牌可以旋转180°,使得上下两个方块互换位置。 编程用最少的旋转次数使多米诺骨牌上下2行点数之差达到最小。 对于图中的例子,只要将最后一个多米诺骨牌旋转180°,可使上下2行点数之差为0。 输入格式 输入文件的第一行是一个正整数n(1≤n≤1000),表示多米诺骨牌数。接下来的n行表示n个多米诺骨牌的点数。每行有两个用空格隔开的正整数,表示多米诺骨牌上下方块中的点数a和b,且1≤a,b≤6。 输出格式 输出文件仅一行,包含一个整数。表示求得的最小旋转次数。 输入输出样例 输入 #1 复制 4 6 1 1 5 1 3 1 2 输出 #1 复制 1 QAQ 那么我们如何调整呢?我们先把骨牌反转,使点数大的在上方;这样保证上方的点数和一定大于下方的点数和;那么翻转时的点数改变就是上下点数的差值乘以 2 了!想到这里,我们可以考虑到:一开始的上下的点数的差值抽象成背包的体积,每一个骨牌当成一个物品,因为我们一开始就把点数大的放在了上面,而每放一次,翻转次数就+ 1 。考虑:要是我后来后悔了,我发现不翻这个骨牌更好怎么办

多米诺骨牌

谁都会走 提交于 2019-11-29 10:32:54
题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点。现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|。例如在图8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2。每个多米诺骨牌可以旋转180°,使得上下两个方块互换位置。 编程用最少的旋转次数使多米诺骨牌上下2行点数之差达到最小。 对于图中的例子,只要将最后一个多米诺骨牌旋转180°,可使上下2行点数之差为0。 输入输出格式 输入格式: 输入文件的第一行是一个正整数n(1≤n≤1000),表示多米诺骨牌数。接下来的n行表示n个多米诺骨牌的点数。每行有两个用空格隔开的正整数,表示多米诺骨牌上下方块中的点数a和b,且1≤a,b≤6。 输出格式: 输出文件仅一行,包含一个整数。表示求得的最小旋转次数。 输入输出样例 输入样例#1: 4 6 1 1 5 1 3 1 2 输出样例#1: 1分析:本题是一道较难的DP题,但是可以通过对多米诺骨牌进行翻转从而实现将本题变为一道较为容易的背包DP,即用f[i][j]表示前i件物品能装到体积为j的最小重量 CODE(诡异的码风???显然不是我写的吗。。。): 1 #include<cstdio> 2 #include<iostream> 3 #include<string> 4 #include<cstring> 5

#(抽象背包的转化)洛谷P1282 多米诺骨牌(提高+/省选-)

假如想象 提交于 2019-11-28 13:47:27
题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点。现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|。例如在图8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2。每个多米诺骨牌可以旋转180°,使得上下两个方块互换位置。 编程用最少的旋转次数使多米诺骨牌上下2行点数之差达到最小。 对于图中的例子,只要将最后一个多米诺骨牌旋转180°,可使上下2行点数之差为0。 输入格式 输入文件的第一行是一个正整数n(1≤n≤1000),表示多米诺骨牌数。接下来的n行表示n个多米诺骨牌的点数。每行有两个用空格隔开的正整数,表示多米诺骨牌上下方块中的点数a和b,且1≤a,b≤6。 输出格式 输出文件仅一行,包含一个整数。表示求得的最小旋转次数。 输入输出样例 输入 #1 复制 4 6 1 1 5 1 3 1 2 输出 #1 复制 1分析:这道题其实是一道十分抽象的背包问题(你在逗我?这那里是背包,明明是贪心好咩?(≧∇≦)ノ)真的是背包啊!QAQ那么我们如何调整呢?我们先把骨牌反转,使点数大的在上方;这样保证上方的点数和一定大于下方的点数和;那么翻转时的点数改变就是上下点数的差值乘以2了!想到这里,我们可以考虑到:一开始的上下的点数的差值抽象成背包的体积,每一个骨牌当成一个物品,因为我们一开始就把点数大的放在了上面