现在的位置: 首页 > 综合 > 正文

poj3126

2013年07月30日 ⁄ 综合 ⁄ 共 5059字 ⁄ 字号 评论关闭

我这个土八路把啸爷治得不轻。。

这个题,我首先想到的不是像可以搜到的所有解题报告那样,枚举这四位,把满足“变一位”且“是素数”的所有点都放在队列里面进行搜索。

说下我的思路:

首先把所有的满足“变一位”且是素数的所有点,都建成图。然后要么最短路,要么搜索连通性(利用BFS特点)。搜索的过程中,由于是按照顺序(素数的大小)建图的,自然可以二分。

/*有感而发*/

刚才跟一个哥哥在谈论,为什么我要让我自己这么累。学T、G,搞ACM,搞好学习,这每一项都很费精力。我也在想,这学期比上学期更加“连轴转”,更加疲劳。

但我想说,也是刘老师给我们说的:决定你高度的是你对自己的要求。

我很享受这个努力的过程,虽然我很累,虽然我时常心情不好,但是每个Accepted都会让我欣喜若狂,我想,现阶段,没有什么能让我更加快乐,除了这个简单的Accepted。

SDUT不是我的归宿,我不应是这里的学生,我应该有更好的学校,I deserved it!

刘老师转发的一篇文章:

每一个优秀的人,都有一段沉默的时光

每一个优秀的人,都有一段沉默的时光,是那一段时光,不抱怨不诉苦,最后渡过了这段感动自己的日子。

什么都还没有,所以没有卖弄的资格。如果有了什么,就没有卖弄的必要。

人生的每一笔经历,都在书写你的简历。多你本以为微不足道的事情,回头看的时候,都有着无法细数的刻度。

自己拼出来的东西,和别人送到嘴边的东西,意义和珍惜的程度都大为不同。

我从不担心我努力了不优秀,只担心优秀的人都比我更努力。

决定你高度的——是你对自己的要求。

以前的我,和你一样,常常担心、常常犹豫,可现在我发现,人生的每一个阶段,都需要我们有一种能力——同一时间完成很多重要的事情。学习的时候,我们要谈谈恋爱。工作的时候,我们要担心家庭。所以,这是一种平衡的能力。相信我,你做的到。因为,那么那么多学长学姐都走过来了,所以不用怕不用怕,你从来都不是一个人。

不要抱怨,抱怨永远只能显示你没本事。因为如果你有本事,就可以改变现状,而不只是忍受。既然改变不了,又不够走开,那么就沉默地接受现实。

隐忍,是我们抵抗世界的力量,当你拥有,你才有资格自由。

我们做的每一个决定,都是由自己来买单。而当你可以把自己不喜欢的东西都做好的时候,相信你一定可以把自己喜欢的东西做的更好!

努力和效果之间,永远有这样一段距离。成功和失败的唯一区别是,你能不能坚持挺过这段无法估计的距离。

你可以试试?

坚持做一件事情,坚持下去。不管它是什么。

选择本身,就是放弃另一种跋涉的可能。尝试倾听自己内心的声音,而不是外在的掌声。 尝试选择适合自己的,而不是别人眼里最好的。 尝试决定我们的决定,不是因为选项表面的光鲜亮丽。 所以,每当我们每做一个选择的时候,总记得——兑现心中的对自己的承诺.不要想得到一切,对生活对自己都慷慨一些。

/*感慨结束*/

下面是代码:

#include <iostream>

using namespace std;

#pragma warning(disable:4996)
#define maxsize 1000
#define inf 1 << 20
#define number_of_Primes 1060
#pragma optimize( "apt", on )

int plist[10005], pcount = 0;
typedef struct point { int prime, id, next_prime, weight; } P;
bool visit[10000];
P v[10000];
struct que{ P info;    int cishu; }q[10000];

int prime(int n)
{
    int i;
    if ((n != 2 && !(n % 2)) || (n != 3 && !(n % 3)) || (n != 5 && !(n % 5)) || (n != 7 && !(n % 7)))
        return 0;
    for (i = 0; plist[i] * plist[i] <= n; i++)
    if (!(n%plist[i]))
        return 0;
    return n>1;
}

void initprime()
{
    int i;
    for (plist[pcount++] = 2, i = 3; i<50000; i++)
    if (prime(i))
        plist[pcount++] = i;
}

bool judge(int a, int b)
{
    char s1[5], s2[5];
    _itoa_s(a, s1, 10);
    _itoa_s(b, s2, 10);

    int countt = 0;
    for (int i = 0; i < 4; i++)
    {
        if (s1[i] != s2[i])
        {
            countt++;
        }
    }
    if (countt == 1return true;
    return false;
}

int buildgraph()
{
    //168-1228

    /*point start;
    start = { prime_start, 1, 0, 0 };
    visit[prime_start] = true;
    v.push_back(start);*/

    int countt = 1;
    int cnt = 0;
    for (int i = 168; i <= 1228; i++)//from no.168 in plist[], to no.1228
    {
        for (int j = 168; j <= 1228; j++)
        {
            if (judge(plist[i], plist[j]))
            {
                point temp;
                temp.prime = plist[i];
                temp.id = countt++;
                temp.next_prime = plist[j];
                temp.weight = 1;
                v[cnt++] = temp;
            }
        }
    }
    return cnt;//size of sets...
}

int Bin_search(P *v, int size, int prime)
{
    int mid = size >> 1;
    int min = 0, max = size;
    while (min <= max)
    {
        mid = (min + max) >> 1;
        if (v[mid].prime == prime && v[mid - 1].prime == prime && v[mid + 1].prime != prime)
        {//return the first one(with same "prime" but not same id) in v[]
            while (v[mid].prime == prime)
                --mid;
            return ++mid;
        }
        else if (v[mid].prime > prime) max = mid - 1;
        else min = mid + 1;
    }
}

int bfs(P *v, int size, int prime_start, int prime_end)
{
    memset(visit, falsesizeof(visit));
    if (prime_start == prime_end) { return 0; }
    int i = Bin_search(v, size, prime_start);
    //cout << v[i].prime << ' ' << v[i].id << endl;
    /*for (int i = 0; i < size; i++)
    {
        cout << v[i].prime << ' ' << v[i].id << ' ' << v[i].next_prime << ' ' << endl;
    }*/

    
    visit[v[i].prime] = true;
    int tail = 0, head = 0;
    for (; v[i].prime == v[i + 1].prime; i++)//push anyone whose "prime" equals to prime_start
    {//but the last one is left over
        q[tail].info = v[i];
        q[tail++].cishu = 1;
        visit[v[i].next_prime] = true;
    }
    //push the last one whose "prime" equals to prime_start
    q[tail].info = v[i];
    q[tail++].cishu = 1;
    visit[v[i].next_prime] = true;
    while (tail != head)//while the queue is not empty
    {
        que temp = q[head];
        //cout << temp.cishu << endl;
        head++;
        if (temp.info.next_prime == prime_end) return temp.cishu;
        int pos = Bin_search(v, size, temp.info.next_prime);
        for (; v[pos].prime == v[pos + 1].prime ; pos++)
        {
            if (visit[v[pos].next_prime] == false)
            {
                q[tail].info = v[pos];
                q[tail++].cishu = temp.cishu + 1;
                visit[v[pos].next_prime] = true;
            }
        }
        if (visit[v[pos].next_prime] == false)
        {
            q[tail].info = v[pos];
            q[tail++].cishu = temp.cishu + 1;
            visit[v[pos].next_prime] = true;
        }
    }
    return -1;//found nothing
}

int main()
{
    int n;
    initprime();
    int size = buildgraph();
    cin >> n;
    while (n--)
    {
        int s, e;
        scanf("%d%d", &s, &e);
        printf("%d\n", bfs(v, size, s, e));
    }
}


我在听James Blunt的Sun on Sunday

抱歉!评论已关闭.