【UVA】11464-Even Parity(二进制枚举子集)

枚举第一行的所有可能情况,之后根据上面行计算下面行(判断是否冲突),获得最终结果。

14058243 11464 Even Parity Accepted C++ 0.275 2014-08-18 05:14:15

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<cmath>
#include<string>
#include<sstream>
#include<ctime>
using namespace std;
#define _PI acos(-1.0)
#define esp 1e-9
#define INF 1 << 30
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> pill;
/*===========================================
===============KinderRiven===================
===========================================*/
#define MAXD 15 + 5
int n;
int Map[MAXD][MAXD];
int solve(int u){
    int MAP[MAXD][MAXD];
    int ans = 0;
    memcpy(MAP,Map,sizeof(MAP));
    for(int i = 0 ; i < n ; i++){
         if(!((u >> i) & 1))
            continue;
         else{
            if(MAP[0][i] == 1);
            else{
                MAP[0][i] = 1;
                ans ++;
            }
         }
    }
    for(int i = 1 ; i < n ; i ++)
        for(int j = 0 ; j < n ; j ++){
             int sum = 0;
             if(i > 1) sum += MAP[i - 2][j];
             if(j > 0) sum += MAP[i - 1][j - 1];
             if(j < n - 1)
             sum += MAP[i - 1][j + 1];
             int t = sum % 2;       /*已经是偶数了*/
             if(t == 0){
                 if(MAP[i][j] == 1)
                    return INF;
             }
             else{
                if(MAP[i][j] == 0){
                    MAP[i][j] = 1;
                    ans ++;
                }
             }
    }
    return ans;
}
int main(){
    int T;
    scanf("%d",&T);
    for(int Case = 1;Case <= T; Case ++){
        int ans = INF;
        scanf("%d",&n);
        for(int i = 0 ; i < n ; i++)
            for(int j = 0 ; j < n ; j++)
                scanf("%d",&Map[i][j]);
        for(int i = 0 ; i < (1 << n) ; i++)
            ans = min(ans,solve(i));
        printf("Case %d: ",Case);
        if(ans >= INF)
        printf("-1\n");
        else
        printf("%d\n",ans);
    }
    return 0;
}

【UVA】11464-Even Parity(二进制枚举子集)

时间: 2024-10-13 03:44:23

【UVA】11464-Even Parity(二进制枚举子集)的相关文章

UVA 11464 Even Parity(枚举递推)

11464 - Even Parity Time limit: 3.000 seconds We have a grid of size N x N. Each cell of the grid initially contains a zero(0) or a one(1). The parity of a cell is the number of 1s surrounding that cell. A cell is surrounded by at most 4 cells (top,

枚举 UVA 11464 Even Parity

题目传送门 1 /* 2 题意:求最少改变多少个0成1,使得每一个元素四周的和为偶数 3 枚举:枚举第一行的所有可能(1<<n),下一行完全能够由上一行递推出来,b数组保存该位置需要填什么 4 最后检查不同的数量,取最小值 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 using namespace std; 10 11 const int MAXN = 20;

uva 11464 Even Parity(逐层递推)

uva 11464 Even Parity We have a grid of size N x N. Each cell of the grid initially contains a zero(0) or a one(1). The parity of a cell is the number of 1s surrounding that cell. A cell is surrounded by at most 4 cells (top, bottom, left, right). Su

1151 - Buy or Build(二进制枚举子集 + 并查集)

这题LRJ书上翻译的有问题,书上说两点之间的cost是两点的欧几里得距离,而题目要求两点的距离是两点欧几里得距离的平方. 其余就没什么好说的了,裸的并查集,需要注意的就是二进制枚举子集的问题. 二进制枚举子集: for(int i = 0 ; i < (1 << s) ; i++){ /*s是集合元素的个数*/ for(int j = 0 ; j < s ; j++){ if(!(s >> j) & 1) continue; else{ } } } 140548

UVa 11825 - Hackers&#39; Crackdown DP, 枚举子集substa = (substa - 1)&amp;sta 难度: 2

题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2925 题意 n个节点,每个节点都有完全相同的n项服务. 每次可以选择一个节点,破坏该节点和相邻节点的某项服务. 问最多能完全破坏多少服务? 思路 如刘书, 直接枚举状态的子集 注意元素个数为k的集合有C^k_n个子集,那么枚举的时间复杂度为sum{c^k_n * 2^k} = 3^n

hdu 1557 权利指数 ( 二进制枚举子集) 解题心得

原题: Description 在选举问题中,总共有n个小团体,每个小团体拥有一定数量的选票数.如果其中m个小团体的票数和超过总票数的一半,则此组合为“获胜联盟”.n个团体可形成若干个获胜联盟.一个小团体要成为一个“关键加入者”的条件是:在其所在的获胜联盟中,如果缺少了这个小团体的加入,则此联盟不能成为获胜联盟.一个小团体的权利指数是指:一个小团体在所有获胜联盟中成为“关键加入者”的次数.请你计算每个小团体的权利指数. Input 输入数据的第一行为一个正整数T,表示有T组测试数据.每一组测试数

做实验 解题报告(二进制枚举子集)

题目描述 有一天,你实验室的老板给你布置的这样一个实验. 首先他拿出了两个长度为 n 的数列 a 和 b,其中每个 a i 以二进制表示一个集 合.例如数字 5 = (101) [2] 表示集合 {1, 3}.第 i 次实验会准备一个小盒子,里面装 着集合 a i 所有非空子集的纸条.老板要求你从中摸出一张纸条,如果满足你摸出的 纸条是 a i 的子集而不是 a i?b i ,a i?b i +1 ,...,a i?1 任意一个的子集,那么你就要被阿掉; 反之,你就逃过一劫. 令你和老板都没有想

UVa 11464 Even Parity

题意:给出n*n的01矩阵,将尽量少的0变成1,使得每个元素的上下左右的元素的和为偶数 看的白书的思路,二进制枚举第一行,再依次算出改变元素的个数, 自己写的时候发现这里不会写,“每个元素的上下左右的元素” 大概就是这个意思 真是太捉急了的说-----------5555 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<s

(二进制枚举子集)买玩具

问题描述 蒜厂幼儿园有 n 个小朋友,每个小朋友都有自己想玩的玩具.身为幼儿园园长的你决定给幼儿园买一批玩具,由于经费有限,你只能买 m 个玩具.已知玩具商店一共卖 k 种玩具,编号为 1,2,3,…k,你让每个小朋友把想玩的玩具编号都写在了纸上.你希望满足尽可能多的小朋友的需求,请计算出最多同时能满足多少个小朋友的玩具需求. 输入格式 第一行,输入三个整数 n,m,k(1≤n≤100,1≤m≤k≤15),中间用空格分开. 接下来 n 行,第 i+1(0≤i< n) 行的第一个数字 ai代表第