The Water Bowls

题意:给定20个01串(最终的状态),每个点变化时会影响左右点,问最终是20个0所需最少操作数?

水题。。直接修改增广矩阵即可;看来最优解不是用高斯消元(若是有Gauss消元0ms A的请留言~~),很多是0ms过的,我用了32ms;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define inf 0x3f3f3f3f
int dir[][] = {{,,,-},{,,-,}};
int a[][];
int equ,var;
int x[],free_var[];
void debug()
{
puts("********");
int i,j;
rep0(i,,equ){
rep1(j,,var)
cout<<a[i][j]<<" ";
cout<<endl;
}puts("********");
}
int Gauss()
{
int i,j,k,row,col,cnt = ;
for(row = ,col = ;row < equ && col < var;row++,col++){
int mx = row;
rep0(j,row+,equ)
if(abs(a[j][col]) > abs(a[mx][col])) mx = j;
if(a[mx][col] == ){
row--; // 行不变;不能通过这里记录自由变元的个数,只能记录没用的col
free_var[cnt++] = col;//记录自由变元的标号;
continue;
}
if(mx != row)
rep1(k,col,var)
swap(a[row][k],a[mx][k]);
rep0(j,row+,equ){
if(a[j][col]){
rep1(k,col,var)
a[j][k] ^= a[row][k];
}
}
}
//debug();
//rep0(i,row,equ)
//if(a[i][var] != 0) return -1; //无解
//枚举自由变元,row表示有用的方程数方程,但是要在判断出有解的前提下才能说有多组解;
//if(row < var) return var - row; //当不需要枚举时,直接返回自由变元的个数
int ans = inf,tot = <<(var - row);
rep0(i,,tot){
int cnt = ,tmp = i;
rep0(j,,var - row){
x[free_var[j]] = (tmp&);
if(x[free_var[j]]) cnt++;//**
tmp >>= ;
}
rep_1(i,row-,){
x[i] = a[i][var];//现在赋为a[i][var],若为自由变元之后还是会等于0,不会重复计算;
rep0(j,i+,equ){
x[i] ^= (a[i][j] && x[j]); //第j个灯会影响到第i盏灯,同时第j盏灯也会亮
}
if(x[i]) cnt++;
}
ans = min(ans,cnt);
}
return ans;
}
void init(int n)
{
rep0(i,,n){
int id = i;
a[id][id] = ;
if(id > ) a[id-][id] = ;
if(id < var-) a[id+][id] = ;
}
}
int tmp[];
int main()
{
int n = ,i,id = ;
equ = var = n;
rep0(i,,){
scanf("%d",&a[i][var]);
}
init(n);
//debug();
printf("%d\n",Gauss());
return ;
}

poj 3185 The Water Bowls的更多相关文章

  1. POJ 3185 The Water Bowls 【一维开关问题 高斯消元】

    任意门:http://poj.org/problem?id=3185 The Water Bowls Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  2. poj 3185 The Water Bowls(反转)

    Description The cows have a line of water bowls water bowls to be right-side-up and thus use their w ...

  3. POJ 3185 The Water Bowls(高斯消元-枚举变元个数)

    题目链接:http://poj.org/problem?id=3185 题意:20盏灯排成一排.操作第i盏灯的时候,i-1和i+1盏灯的状态均会改变.给定初始状态,问最少操作多少盏灯使得所有灯的状态最 ...

  4. POJ 3185 The Water Bowls (高斯消元)

    题目链接 题意:翻译过来就是20个0或1的开关,每次可以改变相邻三个的状态,问最小改变多少次使得所有开关都置为0,题目保证此题有解. 题解:因为一定有解,所以我们可以正序逆序遍历两次求出较小值即可.当 ...

  5. POJ 3185 The Water Bowls (高斯消元 求最小步数)

    题目链接 题意:有20个数字,0或1.如果改变一个数的状态,它左右两边的两个数的状态也会变反.问从目标状态到全0,至少需要多少次操作. 分析: 和上一题差不多,但是比上一题还简单,不多说了,但是在做题 ...

  6. poj 3185 The Water Bowls 高斯消元枚举变元

    题目链接 给一行0 1 的数, 翻转一个就会使他以及它左右两边的都变, 求最少多少次可以变成全0. 模板题. #include <iostream> #include <vector ...

  7. POJ:3185-The Water Bowls(枚举反转)

    The Water Bowls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7402 Accepted: 2927 Descr ...

  8. POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题

    http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...

  9. POJ 3185

    The Water Bowls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4088   Accepted: 1609 D ...

随机推荐

  1. Xenomai 的模式切换浅析

    在Xenomai的用户空间下,有两种模式:primary mode (主模式) 和 secondary mode(次模式). 在主模式下调用Linux系统调用后程序就会进入次模式,反之,在次模式下调用 ...

  2. WPF 多线程

    写法3        private void button1_Click(object sender, RoutedEventArgs e)        {             System. ...

  3. CCLabelTTF 如何支持换行符和换行

    参考自http://www.cocos2d-x.org/wiki/How_does_CCLabelTTF_support_line_breaks_and_wrapping 环境: cocos2d-x ...

  4. (转载)Ant教程

    ant教程(一) 写在所有之前 为了减少阅读的厌烦,我会使用尽量少的文字,尽量明白的表达我的意思,尽我所能吧.作为一个学习者,在我的文章中会存在各种问题,希望热心人指正.目录大概是这样 ant教程 ( ...

  5. java float、double精度研究(转)

    在java中运行一下代码System.out.println(2.00-1.10);输出的结果是:0.8999999999999999很奇怪,并不是我们想要的值0.9 再运行如下代码:System.o ...

  6. 设置background属性使用selector的时候内置?attr报错的解决方案

    当我们设置background属性的时候可以设置background="@color/black" 也可以设置 background="@drawable/selecto ...

  7. uedoc 源码解析

    思路分析 node 包使用 1. JSON5 2. art-template 3.

  8. linux下svn服务搭建

    安装svn需要依赖apr和apr-util这两个软件,所以先安装这两个软件 下载安装APR wget http://apache.fayea.com//apr/apr-1.5.2.tar.gz .ta ...

  9. 鸭子类型duck typing(动态)

    在程序设计中,鸭子类型(duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定.这个概念的名字来源于由Ja ...

  10. php之数据类型自动转换

    1:概述 ---php是一种弱类型的语言,它可以根据运行环境的变化而自动进行数据类型的转换 1.1转换成布尔类型的原则 以下值都将转换成布尔类型中的false: A.布尔类型的false; B.空字符 ...