Mind Hacks

http://mindhacks.cn

这个牛博太好看了 每次看都觉得受益匪浅

刚刚重看一遍<暗时间>(最近每次觉得发懒就看它=D),链接到这一篇 <如何有效地记忆与学习> ,讲的太好了,非常实用。前面一段大概意思就是,我们每一片断的记忆都是一个小岛,必须要让它与其他的小岛多多连结在一起,需要用这块记忆的时候才能有效的找到它。就像 “你要到图书馆去找书,如果你不知道索引号、作者名、书名等信息,你是无法找到你要的那本书的,尽管书就大摇大摆地站在图书馆里的某排书架上(注:严格来说 你是可以找到的——一本一本翻看,看到那本书你自然会注意到是你想要的,不过很可惜对于我们的记忆系统来说似乎并没有这么一个方便的线性遍历机制——如果 我问你,“对于数学你都记得哪些东西?”你能有次序地一个不漏地告诉我吗?)。”

这里“方便的线性遍历机制”让我笑了,几个小时以前我注册了个豆瓣(帐号是x(at)axlarts.com,突然觉得豆瓣很好用,有的同学们快加我),在添加我看过的电影、听过的音乐的时候我就迷茫了。音乐还好,电脑上有一些,柜子里有些碟,ipod上还有一些,都是列表,即所谓的线性遍历=D 但是电影就没有了,然后我的动作是:环顾四周,看有什么能让我想起来最近看过什么电影的东西,并且还抱怨,要是有个单子列上我看过的电影那该多爽啊~ 正是上面这篇文章的point^^”

如果你还没有下决心去看这篇我要翻9页才到底(环境:屏幕分辨率1280*800 ,win7任务栏, Firefox导航栏+tab栏+状态栏)的文章的话,我摘一段很萌的片断:

当然,另一个经常被号召的方法就是实践,比起刚才提到的“虚拟实践”而言,实际实践的印象自然要深刻得多。不过并不是所有的时候实际实践都是必须或者可能 的。例如你并不需要自己去倾家荡产一次才能领会到什么是金融市场中正确的风险控制——你甚至只需要在纸上演算一番就有数了。有证据表明非洲的一种鱼甚至都能使用简单的推理来替代实际经历,例如,如果它和鱼B有过一次冲突并失败了,如果它观察到鱼B和鱼C有一次冲突,鱼B失败了,它就能直接意识到它自己不是鱼C的对手,从而避免所谓“直接去经历一下”而可能导致的灾难性后果(这里的进化价值是显而易见的)。

Enjoy it~

东芝T110 征服屏幕亮度

按照上一篇日志中的方法来的, 开始怎么都不成功, 然后对grub2进行了一些探索.. (文档 http://ubuntuforums.org/showthread.php?t=1195275 )我的机器上好像有bug, 无论如何update-grub都无法更新\boot\grub\grub.cfg. 这个问题是我试图更新kernel的时候发现的. 也可能是我kernel没有编译好, 但是怎么会在/etc/default/grub里加指令也不更新grub.cfg呢.. 还是觉得是bug

我的方法写在了 http://swiss.ubuntuforums.org/showthread.php?p=8767786#post8767786 这个贴子的17楼
Gnome和KDE都能完美工作~ =D

东芝T110装Ubuntu死机的问题

终于行得通了..

关键字: 东芝 T110 T115 Ubuntu 乌邦图 死机

Google进来的同学们.. 你们太走运了 你们不知道这篇文档给你们省去多少麻烦..
这个机器安装或者进入Ubuntu的时候会出现Kernel Panic
内容是

[17.529523] Kernel panic – not syncing: HwThreeWire(): CmdReg: 0XFF RE|WE bits are not clear!!
[17.529525]
[17.544365][drm:intelfb_panic] *ERROR* panic occurred, switching back to text console

我Google到了这篇帖子, 和我的机型一样, 问题一样, 并且只有这一个类似结果, 看来东芝是罪魁祸首 (也因为这型号太新了不好兼容), 死机原因是WLAN卡的驱动. 目前还没有找到不会导致Kernel panic的驱动, 他用的是方案是 ndiswrapper + the MSI version of the Windows Driver , Ndiswrapper的用处是在linux下使用Windows的网卡驱动

步骤:

首先要在BIOS下把WIFI禁用掉, 就可以成功安装进入系统了. 然后在 /etc/modprobe.d/blacklist 文件底部加上blacklist rtl8187se 阻止系统使用自带驱动(一用就崩溃).

然后安装ndiswrapper, 不要用apt-get, 有BUG, 请自己下载source来编译.. 详见我的这个帖子(4楼)
引用一下吧 防止丢了..

这是个BUG, [url=http://www.societyofrobots.com/robotforum/index.php?topic=9813.0]这个帖子[/url]的二楼提出了修复此bug的办法

[quote]Well, I fixed the ndiswrapper problem. Turns out to be a bug in the software.
open ntoskernel.h file inside ndiswrapper-1.55/driver and then change the line 878 as follows (31 is changed to 32)
old line:
Code:
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
new line:
Code:
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)[/quote]

即把ndiswrapper-1.55/driver/ntoskernel.h这个文件的878行作上面的修改就能成功编译了

有的同学说 你为什么不直接apt-get呢, 答案是, 直接编译的版本也有bug.. 我试了, 在[url=https://help.ubuntu.com/community/WifiDocs/Driver/Ndiswrapper]这篇文档[/url]的2.2.1下面有声明.. 不创建kernel模块, 会导致error FATAL: Module ndiswrapper not found when you run modprobe ndiswrapper

装好以后加载上面的那个驱动(ndiswrapper如何使用详见Ubuntu官网的文档) 接着 reboot 再
depmod -a && modprobe ndiswrapper
基本就可以了

WPA貌似不能用, WEP我还没试出来… 但是看人家说的可以用WEP
并且有一个方法是在这里11楼提到

1) 每次开机前先用ndiswrapper加载驱动(必须)
2) sudo rmmod ndiswrapper
3) sudo modprobe rtl8187se

这样就可以用自带驱动了, 很邪门, 但是为什么呢? 作者表示 “Don’t ask me why this works, it just does.”

下面要解决的问题是.. 屏幕亮度不能调, 插耳机外放不关.. 全是驱动问题..天啊

UPDATE:
完美运行!!

环境是KDEdesktop (好像和这个有点关系 以前也是) 原来怎么都连不上 换了上面那个驱动以后完美运行 WPA无误~~ ^^

UPDATE:
rmmod ndis/modprobe rtl以后也无误运行 真不错啊 lucky~ (呸)

看到KDE觉得这才是Ubuntu啊.. ghone(是叫这个么) 太丑太难用了..菜B     KDE大虎逼!

[ACM] POJ1014解题报告

题目:
6种球, 价值分别为1..6, 给出每种的数量, 问能不能分成价值相同的两堆

思路:
1. 将它当成背包问题来看, 包的容积一定(这里的”体积”就是球的价值, 包的容积V=球总价值的一半), 问能不能分成相等两堆即, 包是不是能装满.
2. 这里不用球背包问题中的极值, 不存在价值的概念, 所以v数组用bool型就可以.
3. 因为每种球数量有限制所以不是典型的完全背包问题(目前就看了两个..01背包和完全背包), 我对v中的每一个true它后面每i个赋值成为true, 直到这层的球耗尽. 比如开始v[0]=true v[1..V]=false, 1球的数量为10, 则第一层i循环后, v[0..10]=true v[11.V]=false
4. 3中直接赋值会对后面的计算有影响, 我很蹩脚的另外建了个列表作临时用…
5. 一次AC, 但是时间效率很低, 7XXms..都快超了(大家都爱说..都快超了), 感觉应该是算法过于繁琐..还倒来倒去的, 有空得试试O(log V/c[i])那算法
6. <背包九讲>下载 http://axlarts.com/uploads/documents/pack9lessons.doc 没作者 没写版权声明 直接转了..

代码:

 #include <cstdio>
 #include <cstring>

 int main() {
    int n[7],N,V;
    bool v[60001],t[60001];
    N=0;
    while(++N) {
        V=0;
        bool isEnd=true;
        for(int i=1;i<=6;i++) {
            scanf("%d",n+i);
            V+=n[i]*i;
            if(n[i])
                isEnd=false;
        }
        if(isEnd)
            break;

        printf("Collection #%d:\n",N);
        if(V%2) {
            printf("Can't be divided.\n\n");
            continue;
        }

        ///initialize
        V/=2;
        v[0]=true;
        memset(v+1,false,V);

        for(int i=1;i<=6;i++) {
            memset(t,false,V+1);
            for(int j=0;j<=V;j++) {
                if(!v[j])
                    continue;
                for(int k=0;k<=n[i]*i;k+=i) {
                    if((j+k)>V)
                        break;
                    t[j+k]=true;
                }
            }
            for(int j=1;j<=V;j++)
                v[j]=t[j];
        }

        if(v[V])
            printf("Can be divided.\n\n");
        else
            printf("Can't be divided.\n\n");
    }
    return 0;
 }

[ACM] POJ1011 POJ2362解题报告, 状态压缩

10年9月17号Update…
状态压缩BFS 40行水过.. 代码是POJ2362的, 一样的题.. 原来本文只有1011

#include <stdio.h>

bool dfs(int a[],int u,int n,int __s,int start)
{
    if (start==n)
        return true;
    for(int i=(1<<start);i<(1<<n);i+=(2<<start)) {
        if(i&u)
            continue;
        int count=0;
        for(int j=0;j<n;j++)
            count+=a[j]*((i>>j)&1);
        if(count!=__s)
            continue;

        int __u=u|i;
        int j;
        for(j=0;j<n && ((__u>>j)&1);j++);
        if(dfs(a,__u,n,__s,j)) {
            /* DEBUG
            for(int k=0;k<n;k++)
                if((i>>k)&1)
                    printf("%d ",a[k]);
            printf("\n");   */
            return true;
        }
    }
    return false;
}


int main()
{
    int N;
    scanf("%d",&N);
    while (N--)
    {
        int n,a[21],count=0;
        scanf("%d",&n);
        for (int i=0;i<n;i++)
        {
            scanf("%d",a+i);
            count+=a[i];
        }
        printf("%s\n",count%4?"no":(dfs(a,0,n,count/4,0)?"yes":"no"));
    }
    return 0;
}

Continue reading

[ACM] POJ1061解题报告

扩展欧几里德,ap+bq=c,此题中

a=m-n;
b=-l;
c=y-x;

递归到当b=0是停止此时p一定为1,q值不定,不妨设为0,再递归上去得到p0,然后通解是

p = p0 + b/Gcd(a, b) * t
q = q0 – a/Gcd(a, b) * t

此处有一个小问题 导致了我一直不能AC
设c是gcd的n倍,那么p0*=n,然而后面b/Gcd(a, b) * t要不要乘以n呢,答案是不要,没搞清楚为什么,反正不乘就过了..

#include <cstdio>
#include <cmath>
    /*  p = p0 + b/Gcd(a, b) * t
        q = q0 - a/Gcd(a, b) * t
    45 165 63 22 10000          */

__int64 d;

void exgcd(__int64 *p,__int64 *q,__int64 a,__int64 b) {
    __int64 x,y;
    if(!b) {
        *p=1;
        *q=0;
        d=a;
        return;
    }
    exgcd(&x,&y,b,a%b);
    *p=y;
    *q=(x-a/b*y);
    return;
}

int main() {
    __int64 x,y,m,n,l,a,b,c,p,q,t;
    scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l);
    a=m-n;
    b=-l;
    c=y-x;
    exgcd(&p,&q,a,b);
    if(c%d) {
        printf("Impossible\n");
        return 0;
    }
    n=c/d;
    t=(b/d);
    t=t>0?t:-t;
    p=(n*p%t+t)%t;
    printf("%I64d\n",p);
    return 0;
}

[ACM] POJ2965 ver.2

if(a[i][j]==’+’)直接把结果矩阵里面以i,j为中心的十字全部改变bool值就好了,方便的算法
但是应该效率高啊 怎么这么慢.. 比递归慢好几倍 奇怪..

#include <cstdio>
#include <cstring>
int main() {
    char a[4][5];
    int r[32];
    int i,j,k,n=0,temp;
    for(i=0;i<4;i++)
        gets(a[i]);
    for(i=0;i<4;i++)
        for(j=0;j<4;j++) {
            temp=0;
            for(k=0;k<4;k++)
                temp+=a[i][k]/2+a[k][j]/2;
            temp-=a[i][j]/2;
            if(temp%2) {
                r[n++]=i;
                r[n++]=j;
            }
        }
    printf("%d\n",n/2);
    for(i=0;i<n;i+=2)
        printf("%d %d\n",r[i]+1,r[i+1]+1);
}

[ACM] POJ2965解题报告

爽死了 两个小时又切掉一题某人的fail!
递归大美!!! 我的思维和机器的思维真是惊人的合拍啊^^

思路:
把矩阵分成两个三角矩阵


  -+--
-  ---
--  --
-+-  -

这样然后先对上三角的第行和下三角的(左起)第列枚举,接着对上三角第行和下三角第列枚举,关键就是在从“一”进入“二”的时候 对左上角的矩形进行判断,这一个矩形是进入“二”以后再也接触不到的一个区域,如果此区域不是全部open那以后的递归就不用做了,大大提高效率 :) 自己想出来的噢~~ AC32ms 看了比绝大部分人快 也~~

debug用了大半个小时 其实只有一个错……上三角的最后一行没有进行枚举,无法得到结果,浪费那么长时间遗憾啊
debug的时候想到的技巧:因为递归层数太多显然无法一步一步调试 于是我加了这段判定代码:

if(r[0][0]&&!r[0][1]&&r[0][2]&&r[0][3]
 &&!r[1][0]&&!r[1][1]&&!r[1][2]&&!r[1][3]
 &&!r[2][0]&&!r[2][1]&&!r[2][2]&&!r[2][3]
 &&r[3][0]&&!r[3][1]&&r[3][2])
	i=1;

在i=1;上面设breakpoint就可以一步到达终点来调试了..开始多加了个&&r[3][3]因为下面的bug一直搞不出来
擦 来不及了 赶快贴了代码去学校抄作业

#include <cstdio>


bool a[4][4],r[4][4];

void change(int x,int y) {
    int i;
    for(i=0;i<4;i++) {
        a[x][i]=a[x][i]?false:true;
        a[i][y]=a[i][y]?false:true;
    }
    a[x][y]=a[x][y]?false:true;
    r[x][y]=r[x][y]?false:true;
}

bool calc(bool istop,int row,int from) {
    int i,j;

    /*TESTER
    for(i=0;i<4;i++) {
        for(j=0;j<4;j++)
            printf("%d",r[i][j]);
        printf("\n");
    }

    if(r[0][0]&&!r[0][1]&&r[0][2]&&r[0][3]
    &&!r[1][0]&&!r[1][1]&&!r[1][2]&&!r[1][3]
    &&!r[2][0]&&!r[2][1]&&!r[2][2]&&!r[2][3]
    &&r[3][0]&&!r[3][1]&&r[3][2])
        i=1;*/

    if(!istop&&row==3) {
        for(i=0;i<4;i++)
            if((!a[i][3])||(!a[3][i]))
                return false;
        return true;
    }
    if(istop) {
        if(from>3-row)
            return calc(false,row,0);
        if(calc(true,row,from+1))
            return true;
        change(row,from+row);
        if(calc(true,row,from+1))
            return true;
        change(row,from+row);
        return false;
    }
    else {
        if(from>2-row) {
            for(i=0;i<=row;i++)
                if((!a[i][row])||(!a[row][i]))
                    return false;
        return calc(true,row+1,0);
        }
        if(calc(false,row,from+1))
            return true;
        change(row+from+1,row);
        if(calc(false,row,from+1))
            return true;
        change(row+from+1,row);
        return false;
    }
}

int main() {
    int i,j,n;
    for(i=0;i<4;i++) {
        for(j=0;j<4;j++)
            a[i][j]=getchar()=='-'?true:false;
        getchar();
        r[i][j]=false;
    }
    calc(true,0,0);
    n=0;
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
            if(r[i][j])
                n++;
    printf("%d\n",n);
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
            if(r[i][j])
                printf("%d %d\n",i+1,j+1);
    return 0;
}

[ACM] POJ1573解题报告

夜里边切题边等电影缓冲真是太爽了..
正在慢慢的切某人切不下来的题..
1573挺简单的 以后这种模拟的数组我都从1开始就好了..省得墨迹墨迹的整的头大..

主要就是想到一个监视指针的方法..做个tester指针数组 对应map上面所有的单元
这样本来看不懂的指针地址(0x22fb18这样)就能通过查找tester来获得它的位置(tester是一个地址的数组 找到对应的 然后数数)

详见下图 ap是tester,p==0x22fb18,在ap中排第10个,则p==*(ap[9])

#include <cstdio>
#include <cstring>
typedef struct spot {
    char c;
    bool b;
    int n;
} Spot;
Spot *p;

void move() {
    switch(p->c) {
        case 'N':
            p-=12;
            break;
        case 'S':
            p+=12;
            break;
        case 'E':
            p+=1;
            break;
        case 'W':
            p-=1;
    }
}

int main() {
    int i,enter,j,n,rows,cols;
    Spot a[12][12];
    /*Tester
    Spot *(ap[3][6]);
    for(i=0;i<3;i++)
        for(j=0;j<7;j++)
            ap[i][j]=a[i]+j;*/
    while(1) {
        for(i=0;i<144;i++) {
            ((Spot *)a+i)->c=-1;
            (a[0]+i)->b=false;
        }
        n=0;
        scanf("%d%d%d",&rows,&cols,&enter);
        if(!rows&&!cols&&!enter)
            return 0;
        getchar();
        for(i=1;i<=rows;i++) {
            for(j=1;j<=cols;j++)
                a[i][j].c=getchar();
            getchar();
        }
        p=a[1]+enter;
        /* TESTER
        for(i=0;i<rows;i++) {
            for(j=1;j<=cols;j++)
                printf("%c",a[i][j].c);
            printf("\n");
        } */
        while(1) {
            p->b=true;
            p->n=n;
            if(p->c==-1) {
                printf("%d step(s) to exit\n",n);
                break;
            }
            move();
            if(p->b) {
                printf("%d step(s) before a loop of %d step(s)\n",p->n,n+1-p->n);
                break;
            }
            n++;
        }
    }
    return 0;
}