[HIHO1196]高斯消元·二(高斯消元、枚举自由变元)

题目链接:http://hihocoder.com/problemset/problem/1196

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3
  4 typedef pair<int, int> pii;
  5 const int maxn = 230;
  6 int equ, var;
  7 int a[maxn][maxn];
  8 int x[maxn];
  9 int free_x[maxn];
 10 int free_num;
 11 int ret;
 12
 13 int gauss() {
 14     int max_r, col, k;
 15     free_num = 0;
 16     for(k = 0, col = 0; k < equ && col < var; k++, col++) {
 17         max_r = k;
 18         for(int i = k + 1; i < equ; i++) {
 19             if(abs(a[i][col]) > abs(a[max_r][col]))
 20                 max_r = i;
 21         }
 22         if(a[max_r][col] == 0) {
 23             k--;
 24             free_x[free_num++] = col;
 25             continue;
 26         }
 27         if(max_r != k) {
 28             for(int j = col; j < var + 1; j++)
 29                 swap(a[k][j], a[max_r][j]);
 30         }
 31         for(int i = k + 1; i < equ; i++) {
 32             if(a[i][col] != 0) {
 33                 for(int j = col; j < var + 1; j++) {
 34                     a[i][j] ^= a[k][j];
 35                 }
 36             }
 37         }
 38     }
 39     for(int i = k; i < equ; i++) {
 40         if(a[i][col] != 0)
 41             return -1;
 42     }
 43     if(k < var) return var - k;
 44     for(int i = var - 1; i >= 0; i--) {
 45         x[i] = a[i][var];
 46         for(int j = i + 1; j < var; j++) {
 47             x[i] ^= (a[i][j] & x[j]);
 48         }
 49     }
 50     return 0;
 51 }
 52
 53 char G[maxn][maxn];
 54 int n, m;
 55
 56 int main() {
 57     // freopen("in", "r", stdin);
 58     m = 5, n = 6;
 59     var = equ = 30;
 60     ret = 0;
 61     memset(a, 0, sizeof(a));
 62     for(int i = 0; i < n; i++) scanf("%s", G[i]);
 63     for(int i = 0; i < m; i++) {
 64         for(int j = 0; j < n; j++) {
 65             if(G[i][j] == ‘0‘) a[i*n+j][var] = 1;
 66             else a[i*n+j][var] = 0;
 67         }
 68     }
 69     for(int i = 0; i < 30; i++) {
 70         a[i][i] = 1;
 71         if(i % 6 != 0) a[i-1][i] = 1;
 72         if(i % 6 != 5) a[i+1][i] = 1;
 73         if(i > 5) a[i-6][i] = 1;
 74         if(i < 24) a[i+6][i] = 1;
 75     }
 76     int v = gauss();
 77     if(v == -1) ret = -1;
 78     else if(v != 0) {
 79         ret = maxn;
 80         int tot = 1 << v;
 81         for(int i = 0; i < tot; i++) {
 82             int cnt = 0;
 83             for(int j = 0; j < v; j++) {
 84                 if(i&(1<<j)) {
 85                     x[free_x[j]] = 1;
 86                     cnt++;
 87                 }
 88                 else x[free_x[j]] = 0;
 89             }
 90             for(int j = var - v - 1; j >= 0; j--) {
 91                 int idx;
 92                 for(idx = j; idx < var; idx++) {
 93                     if(a[j][idx]) break;
 94                 }
 95                 x[idx] = a[j][var];
 96                 for(int l = idx + 1; l < var; l++) {
 97                     if(a[j][l]) x[idx] ^= x[l];
 98                 }
 99                 cnt += x[idx];
100             }
101             ret = min(ret, cnt);
102         }
103     }
104     else for(int i = 0; i < var; i++) ret += x[i];
105     printf("%d\n", ret);
106     vector<pii> va;
107     for(int i = 0; i < 30; i++) {
108         if(x[i]) {
109             int pos = i + 1;
110             int r = 1, c = 0;
111             while(pos > 6) {
112                 pos -= 6;
113                 r++;
114             }
115             c += pos;
116             va.push_back(pii(r, c));
117         }
118     }
119     sort(va.begin(), va.end());
120     for(int i = 0; i < va.size(); i++) {
121         printf("%d %d\n", va[i].first, va[i].second);
122     }
123     return 0;
124 }
时间: 2024-11-05 12:26:05

[HIHO1196]高斯消元·二(高斯消元、枚举自由变元)的相关文章

POJ 1753 Flip Game (高斯消元 枚举自由变元求最小步数)

题目链接 题意:4*4的黑白棋,求把棋全变白或者全变黑的最小步数. 分析:以前用状态压缩做过. 和上题差不多,唯一的不同是这个终态是黑棋或者白棋, 但是只需要把给的初态做不同的两次处理就行了. 感觉现在还只是会套模板,不能独立的思考,好伤心.... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath&g

设计模式(十二)享元模式(Flyweight Pattern)

一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严重,然而享元模式可以解决这个问题,下面具体看看享元模式是如何去解决这个问题的. 二.享元模式的详细介绍 在前面说了,享元模式可以解决上面的问题了,在介绍享元模式之前,让我们先要分析下如果去解决上面那个问题,上面的问题就是重复创建了同一个对象,如果让我们去解决这个问题肯定会这样想:“既然都是同一个

PhotoShop算法实现进阶-模糊滤镜-高斯滤波(二十三)

PhotoShop算法实现进阶-模糊滤镜-高斯滤波(二十三) [email protected] http://blog.csdn.net/kezunhai 高斯模糊(Gaus Blur)采用二维高斯模板对图像进行模糊处理,用于图像模糊化(去除细节和噪声),它的处理效果给人一种更佳柔和的感觉. 一维高斯: 二维高斯: 理论上,高斯分布在所有定义域上都有非负值,这就需要一个无限大的卷积核.实际上,仅需要取均值周围3倍标准差内的值,以外部份直接去掉即可. 如下图为一个标准差为1.0的整数值高斯核:

设计模式(十二)—— 享元模式

模式简介 运用共享技术有效地支持大量细粒度地对象. 通常情况下,面向对象技术可以增强系统地灵活性及可扩展性,在系统开发过程中,我们会不断地增加类和对象.当对象数量过多时,将会带来系统开销过高.性能下降等问题.享元模式通过共享相同或相似的对象来解决这一类问题.在介绍享元模式之前,首先要弄清楚两个概念:内部状态(Intrinsic State)和外部状态(Extrinsic State). 内部状态是存储在享元对象内部并且不会随环境改变而改变的状态,因此内部状态可以共享.例如,围棋中的棋子,它们的形

深刻理解Python中的元类(metaclass)以及元类实现单例模式

深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例模式的那一节有些疑惑.因此花了几天时间研究下元类这个概念.通过学习元类,我对python的面向对象有了更加深入的了解.这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博客对其进行了翻译. 一.理解

多么痛的领悟---关于RMB数据类型导致的元转分分转元的bug

关于金额的数据类型,以及元转分分转元之间这种转换,以元和分的比较,我相信很多人都踩过坑. 反正我是踩过. 而且,昨天和今天又重重的踩了两脚. 代付查询接口,支付中心给溢+响应的报文里,amount的单位是分,这无可厚非,非常合理. 昨天,负责溢+代付的中威反映,有一单虽然返回的是代付成功的状态,但因校验支付中心返回的代付金额与溢+存储的代付金额不一致,而导致溢+未能更新代付单的状态. 经查,db里代付金额字段的数据类型是double,单位是元,程序里对应的pojo也把代付金额的属性设置为doub

牙膏5元,牙刷2元,肥皂3元,100元买这三种恰好花光,请问有多少种可能性

Console.WriteLine("牙膏5元,牙刷2元,肥皂3元,100元买这三种恰好花光"); int a1 = 0, b1 = 0, c1 = 0, sum = 0; for (int a = 0; a <= 20; a++) { a1 = 5 * a; for (int b = 0; b <= 50; b++) { b1 = 2 * b; for (int c = 0; c < 33; c++) { c1 = 3 * c; if (a1 + b1 + c1 =

绑卡免费拿15元,投900元【拿230元羊毛】中国平安陆金所

2015年1月1日至31日有效(1月13日更新最新规则) http://affiliate.lufax.com/action/DnPg,点此链接注册 快讯:1仟元起投(用币后只需900元),[57天]期限,到期还本付息的[富盈人生],已经放出[第80期],1月23日14点募集结束(可能提前集满结束)大家抓紧吧~~! [关于富盈人生]富盈人生投资方向:(安全性类似于货币基金,但不能随时提现,只能到期一次性收取本息,以下copy陆金所网站)主 要投资于货币基金等货币类资产.央行票据.银行定期存款.国

疯了!店主好评返现,手一抖,结果错把38元返成3873元!

淘宝购物时,如果卖家给你多返了100倍的钱,而这100倍的钱高达3873元,你会怎么处理?如数退回给卖家?还是直接关掉旺旺和手机? 记者前几天在头条发布的文章<记者潜伏卖家QQ群,探访淘宝最新自杀式爆款刷法>,获得了很多人的关注.也有很多人慕名去关注了这个平台,很多人私信问我,这个免费包邮送产品的天天撸团平台是不是骗人的?是不是骗流量的?具体我也没有认真求证过.不过我已经在里面领了几件产品,还都全部返现了.所以应该是真的吧,不然里面的卖家应该不会这么活跃. 记者卧底的QQ群里面,昨天晚上还发生

python 元类与定制元类

1:元类 元类:类的创建与管理者 所有类的元类是type class a: pass print(type(a)) 结果:<class 'type'> 2:定制元类 类的实例化过程:(可看类的基础与要点) 1)调用__new__()创建实例 2)调用__init__()初始化上面创建出来的实例 所以:定制实例便是改变父类的__new__()或__init__()方法 例子: 1 class MyMeta(type): 2 def __init__(self,name,bases,dicts):