行者无疆 始于足下 - 行走,思考,在路上
zoj1489
题目不是很难,重点是时间限制。因此需要优化下算法,不要暴力的用pow(x, y)函数。我用的是pow(x,y)图省事,先是出现了久违的compilation error。思前想后,自己的机器上编译没有问题啊。看了zoj的输出指示:
p.cc: In function 'int main(int, char**)': p.cc:19: error: call of overloaded 'pow(int, int&)' is ambiguous /usr/include/bits/mathcalls.h:154: note: candidates are: double pow(double, double) /usr/include/c++/4.2/cmath:373: note: long double std::pow(long double, int) /usr/include/c++/4.2/cmath:369: note: float std::pow(float, int) /usr/include/c++/4.2/cmath:365: note: double std::pow(double, int) /usr/include/c++/4.2/cmath:361: note: long double std::pow(long double, long double) /usr/include/c++/4.2/cmath:357: note: float std::pow(float, float)
估计大概是libc版本不同造成的。修改了以下程序,又出现了TLE的错误了。后来想了想,利用同余特性,改进了程序,还是TLE。程序如下:
#include <iostream> using namespace std; int main(int argc, char* argv[]) { int n, temp, result; while(cin >> n) { if((n & 0x1) == 0) cout << "2^? mod " << n << " = 1" << endl; else { temp = 1; result = 1; while(1) { temp *= 2; temp %= n; if(temp == 1) break; ++result; } cout << "2^" << result << " mod " << n << " = 1" << endl; } } return 0; }
这是怎么回事呢?百思不得其解。俗话说外事不决问google,内事不决问baidu。于是baidu之,发现只要将判断条件改进下就行,AC的程序如下:
#include <iostream> using namespace std; int main(int argc, char* argv[]) { int n, temp, result; while(cin >> n) { if((n & 0x1) == 0 || n < 2) cout << "2^? mod " << n << " = 1" << endl; else { temp = 1; result = 1; while(1) { temp *= 2; temp %= n; if(temp == 1) break; ++result; } cout << "2^" << result << " mod " << n << " = 1" << endl; } } return 0; }
一个n<2,应该无关紧要……先记着这笔帐。
AC了26道题目了。都是水题。不管怎样,先凑个数练练手也好。时间紧迫。一定的数量还是必须的。要不以后出去也忒没面子了。
zoj 1201
继续刷水题。看到这道题目有印象,想想,ms当初算法是想出来了。就是自己想写个链表却有bug,结果一直拖着没有解决。好歹前几天又研究了下STL,这下派上用场了。不过代码写的很乱,感觉不够优美,不beautiful。最后的输入输出有些小问题,导致第一次提交是Presentation Error。后来仔细看了看搞定。算了,先糊弄着看吧。15道了。还有285道。一道一道的啃。
具体解题思路就不写了。大概如下,如果是P,就进行双层循环,然后搞一个数组的索引(不知道该怎么说哎……);如果是I,建立一个链表,从Inversion[]的最后一个元素开始循环,然后分别处理每个元素。根据Inversion[i]的数值遍历链表并插入合适的元素。最后的输入输出有问题。仔细看一下就行了。
#include <iostream> #include <list> using namespace std; const int max_size = 50; int main(int argc, char *argv[]) { int cases; char method; while (1) { cin >> cases; if (cases == 0) { break; } cin >> method; if (method == 'P') { int P[max_size], I[max_size]; for (int i = 0; i < cases; ++i) { cin >> P[i]; I[i] = 0; } for (int i = 0; i < cases; ++i) { for (int j = i + 1; j < cases; ++j) { if (P[i] > P[j]) { I[P[j]-1]++; } } } for (int i = 0; i < cases - 1; ++i) { cout << I[i] << " "; } cout << I[cases - 1] << endl; } else if (method == 'I') { list<int> P; int I[max_size]; for (int i = 0; i < cases; ++i) { cin >> I[i]; } P.push_back(cases); for (int i = cases - 2; i >= 0; --i) { list<int>::iterator it = P.begin(); for (int j = 0; j < I[i]; j++) { it++; } P.insert(it, i+1); } list<int>::iterator it; int i; for (i = 0, it = P.begin(); i < P.size() - 1; ++it, ++i) { cout << *it << " "; } cout << *it << endl; } else { break; } } return 0; }
zoj 1089
依然是很菜很菜。开始的时候有些迷惑,后来想了想原来就是给你N个整数取6个有多少种组合。然后在做一定的输出处理的题目。想到的有递归和初步的DFS,可是都不太会写。就写了一个很土的程序。土的掉渣。输入输出还是不熟练,提交了三次才AC。没脸见人了。加油加油!
#include <iostream> using namespace std; int main() { const int max_number = 15; int numbers; int set[max_number]; int cases = 0; while (1) { cin >> numbers; if (numbers == 0) { break; } cases++; if ( cases >= 2 ) { cout << endl; } for (int i = 0; i < numbers; i++) cin >> set[i]; int i0, i1, i2, i3, i4, i5; for (i0 = 0; i0 <= numbers - 6; i0++) for (i1 = i0 + 1; i1 <= numbers - 5; i1++) for (i2 = i1 + 1; i2 <= numbers - 4; i2++) for (i3 = i2 + 1; i3 <= numbers - 3; i3++) for (i4 = i3 + 1; i4 <= numbers - 2; i4++) for (i5 = i4 + 1; i5 <= numbers - 1; i5++) cout << set[i0] << " " << set[i1] << " " << set[i2] << " " << set[i3] << " " << set[i4] << " " << set[i5] << endl; } return 0; }
顺便,昨天搞了个行者无疆单车知识入门讲座,比较轰动,草坪上搭起了大大的本营帐篷,七八辆车,二十多个人,我使出浑身解数,定车、俯卧撑、拆车修车、旅行经历等等。整个讲座还算比较精彩,从7点一直唠叨到10点20左右。已经有些冷了。于是借了辆车回到yq。拉力听讲座的有大二的,也有博二的。讲完了一个小dd跑过来跟我说“谢谢你,学长”,好可爱;有个博二的说我“非常成熟”,有几个mm被我讲的羞答答的,大概是受不了行者的ws之风了;还有几个wsn,中途跑到校友林里面小便,我甚至都能听到嘘嘘声音,何况mm会羞了。后来我也去尿了一泡……
实验室又来了项目。所以今天告别了亲爱的gentoo先生,回到了VS2008的怀抱。大体来说是做一个嵌入式平台上模仿iphone界面的东西。引擎什么的基于已有的几万行代码。其实去年已经初步接触这个项目,只是课程太忙,时间上安排不过来。这次老师也实在是缺人了,把我这么菜的也拉了过来。一个毕业的研究僧学长领头,还有两个研究僧是主力。两个刚考完研的大四同学每天从下沙赶来,怪辛苦的,不过他们水平实在太菜,连c++都不会,还得我教……看来我菜,有人比我还菜……
主要战略就是在实验室泡二十天,争取能搞出点成果来。将来简历上也好有点东西。否则一片花拳绣腿,怕是饭都吃不饱了。
不过头疼的还是课程。算了,赶时间补吧。还有289道zoj题目。还有lpi。顺便有空再去刷一次我那可怜的六级成绩。
over。再来一道zoj。
zoj 1057
编程还是很菜。很简单的题,基本的输入输出格式弄了很久。没脸见人了。zoj的选拔标准有变,我看能否在两个月之内拿下三百道题。还得把lpi考掉,恐怕要顺延到暑假了。加油加油。
晚上的计算机体系结构实验搞的很崩溃,硬件的课程,该怎么办呢。也不知道对自己以后能有多大的帮助,目前策略是得过且过……组了个队,同组的竟然是个04级的,令我颇为差异。看来,计算机的毕业也不是那么简单。
is-programmer博客系统越来越强大了。最近加入的代码高亮真的是非常的棒!赞!
顺便,86版五笔初有小成,逐渐转移到五笔输入法,效率之上的生活!
#include <iostream> using namespace std; int main(int argc, char *argv[]) { int cases; const int max_size = 20; int a[max_size]; int b[max_size]; int sum_a; int sum_b; int times = 0; while (cin >> cases) { if (cases == 0) { break; } else { times++; if (times >= 2) { cout << endl << endl; } } sum_a = sum_b = 0; for (int i = 0; i < cases; ++i) { cin >> a[i]; } for (int i = 0; i < cases; ++i) { cin >> b[i]; } for (int i = 0; i < cases; ++i) { if (a[i] == 1 && b[i] == 2) { sum_a += 6; } else if (a[i] == 2 && b[i] == 1) { sum_b += 6; } else if (a[i] - b[i] == 1) { sum_b += a[i] + b[i]; } else if (b[i] - a[i] == 1) { sum_a += a[i] + b[i]; } else if (a[i] - b[i] >= 2) { sum_a += a[i]; } else if (b[i] - a[i] >= 2) { sum_b += b[i]; } else; } cout << "A has " << sum_a << " points. B has " << sum_b << " points."; } return 0; }