我这个土八路把啸爷治得不轻。。
这个题,我首先想到的不是像可以搜到的所有解题报告那样,枚举这四位,把满足“变一位”且“是素数”的所有点都放在队列里面进行搜索。
说下我的思路:
首先把所有的满足“变一位”且是素数的所有点,都建成图。然后要么最短路,要么搜索连通性(利用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 == 1) return 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, false, sizeof(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