行者无疆 始于足下 - 行走,思考,在路上

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道题目了。都是水题。不管怎样,先凑个数练练手也好。时间紧迫。一定的数量还是必须的。要不以后出去也忒没面子了。

实验室几日

3月底接到学长的电话,说有一个紧急项目需要赶工,大概是需要二十天奋斗。我犹豫再三——编译原理还没有看(到现在也没有看……),很多课也需要补补了,计算机组成和计算机体系结构两门大头更是头疼。岂料第二天导师又给我来了电话。那时候早晨九点,我还在床上睡觉,看到导师的电话,立马醒了过来,连声“是、我去、一定”。就这样,还引来室友一片羡慕——“你们导师还给你电话啊,我导师就没理过我……”。于是周日去实验室开会,导师布置任务。会上导师间接批评了我。想想也是,导师说的也有道理,自己乱搞,到头来还是花拳绣腿。应用才是检验你水平最重要的标准。自己进实验室也大半年了,却始终没有做什么东西出来。一来自己水平不济;二来很多东西尚待熟悉;三来自己课业也不轻松。不过这样下去也不是个事情,人家没有实验室的想办法挤进实验室,自己身在福中不知福,倒真是有点不应该了。

项目大概是这样,在自己开发的一套gui engine的基础上,重新写一套模仿iphone的控件,并写成一套业务逻辑,交给客户。开发环境是VS2008,嵌入式系统用的是基于WINCE的Windows Mobile 6.0。整套老的基础代码大概写了好几年了,有5万多行,实现了一个基本的WINCE应用程序的GUI。以后的发展方向可能是平台的移植,布局管理器的加入和bug的修复。我们这个项目就是在这个代码的基础上临阵磨枪,20天仿出一套iPhone的东西。

所谓“会者不难,难者不会”,对于熟悉这个体系的人来说,改造美工都比较容易;对于新手,初来乍到,恐怕光是熟悉Windows消息循环都要花一定的时间。好在我看过200页的《Windows核心编程》,对于基本原理还是略知一二,加上前人写好的程序框架,在这方面也不用操太多的心。

整个项目组六个人,一个毕业的学长,一个公司的员工,两个大四的刚考上zju研究生的学长,一个大三软工的同学,还有我。不过令我感到十分震惊的是,两位大四的和大三软工的学习,竟然连基本的c++语法、输入输出都有不小的问题。可见,当我们抱怨工作难找的时候,又是否考虑过,自己就竟能为你的雇主带来些什么呢?

自己主要负责文本类型控件的编写。差不多快十天了。其中一天泡了图书馆看《C++标准程序库》,两三天陪陪mm,两三天搞搞课业,剩下几天都在实验室了。最终还算有些成果——虽然以学长的标准,这不算什么。

目前的控件支持Alpha透明、圆角效果、字体颜色、字体背景色、部分支持字体大小、字体排列方式、字体的下划线粗体等效果、位图和png图片的载入。存在的问题主要是字体换行和光标定位。当然,我一个人是做不来这么多工作的。我的工作只是参照原来的老的控件代码,整合一些新的函数接口,提供一个统一易用的控件使用接口而已。不过,说起来容易做起来麻烦。许多参数,字体大小,颜色,alpha值需要自己慢慢调。也曾考虑过设计模式的问题,想设计一个IStyle类,统一管理控件外观,不过这超出了我的能力和职责。Anyway,这个过程还是收获了很多。更加深刻的体会到,把你自己的想法转换成可运行的代码,让你的代码编程漂亮的GUI界面,这样的转换需要多大的能力和精力。否则,MINIGUI也不会耗时十年,才写出3.0。

此时我又想到了Open Source。我相信Open Source never die。我也相信终有一天,所有的软件代码会向数学公式一样,成为程序员通用的语言,而不是藏着掖着。我初步体会到了交流的重要性。事实上,软件开发过程中,闭门造车是一件非常可怕的事情——浪费时间、浪费金钱、浪费生命。Reinvent the wheel,这也是我对这个项目始终提不起兴趣放不开手脚的最大阻碍吧。我还想着,什么时候Qt也能运行在windows mobile平台上,这样我们就不用天天面对着这坨猪肉一般的代码发呆了。

另:可能你会问“为什么你的vs是黑色的?”。其实,google下filetype:vssettings就可以了。设置黑底白字,可以有效的保护眼睛,延长屏幕的使用寿命。另外,visual assist,非常好用的vs插件;viEmu,让vs的编辑器拥有简单的vim的快捷编辑功能,提高工作效率。俗话说,磨刀不误砍柴功,简单的配置,换来的是日后的方便。

Anyway,该做的还是要做。完成这几个控件,写几个页面。然后好好补补课程,一个短学期又要过去了。好快。

“每当一个人走在月亮下的时候,就会想起你的手”。

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;
}

妞走了

妞走了,去深圳,打拼自己的天地。尽管自己很忙,还是抽出一天的时间,陪她走完这段路。从最开始决定考研、hjc午后阳光座椅的宏伟战略的制定、到图书馆瑟瑟发抖的看书自习写opengl、到雨雪中一把伞撑起两个人的天地、到元旦简单的放松和备考、最后的冲刺、1月份我的迷茫黑白颠倒、厦门三日的惬意、寒假的焦躁等待、考研失败的苦涩、找工作的心酸和性别歧视、仿佛,整个大四,我也走了一遭。不过我觉得,只要努力奋斗,无论如何,读研、工作、还是出国,最后总能有个好结果。还是那句话,对得起自己的良心,对得起自己的父母。两个大山走出来的娃娃,可能奋斗到三十岁,才能获得某些人一出生就拥有的所谓“城市户口”,个中苦涩,冷暖自知。

布袋mm也要去千岛湖训练了。想想在医院康复了一年,成果还是挺大的——“已经可以借助器具‘走’一百多米了”。由于课业繁忙,去年暑假至今,总共去探望过三次——暑假开学、期中考试和今年开学。每次都能看到明显的进步。我想一个人命运如此,又能如此坚强地面对,面对生活,我们又有什么资格说不呢?

上午在hjc做了次牙齿洁治,有些痛,过后还是蛮舒爽的。然后一个人去凤起路花鸟市场转了转,看中了一盆矮矮的红枫,不过好贵,要45元。我又不会讲价,就给mm打电话,让她过来挑。沙县小吃吃了点东西,mm带我再战花鸟市场,果然是老将出马,瞬间40块钱搞定。红枫配文竹,加上一盆景天科的叫不上名字的盆栽,拿到寝室,于是就有了下面的小资图片:

嗯。杯子是lock&lock的,泡的是一个同学送的杭白菊和枸杞,红茶是借别人炉头敲诈来的。c++标准程序库那本书定价108元,我花了10元搞定的。因为最近硕士生滚蛋,便宜书大大的有。我很happy。尽管我的书已经够多,可是还是忍不住买了好多。那本《计算机程序设计艺术》到现在也没怎么看过,真的成“重量级装饰品了”。不过有时间我会看的。

周五在计算机前沿技术课上听了神牛周昆的讲座,关于GPU Programming,介绍了他的BSGP。我想这大师的水平毕竟是不一样,听了他的讲座搞得我有一种直博的冲动。亚洲第一的实验室,cad&cg,口水大大的。看一个人是什么水平,要看他的朋友圈子。平台不一样,人生也会不一样。虽说ckc的直博比保研容易,但以我的GPA,恐怕这也是痴人说梦罢了。

实验室的项目初有小成。自己写的静态文本标签支持位图背景,alpha混合,圆角框、背景色、字体大小。剩下的ITextField,尚未开工。在我的心里,送mm比这个更重要。

小包的Chasing Youth Club of Zhejiang University还是蛮有希望的。也不枉费我辛辛苦苦写的几十页文档。

接下来的几个月,生活应该没什么变化:

4月:6日-20日,重点在实验室项目。写完ITextField,有机会写写上层的Application。课业:计算机前沿技术讲座完成论文,人工智能补课看书,编译原理多补点作业,网络补课,组成和体系实验继续蒙混过关。4-20日-29日,复习,争取过了编译原理的考试。4月30日,陪陪远方来的同学。

5月:1日-5日,上海世博三天,可能还会逃两天课,去南京走走。5日-20日:继续各种课程。20日-30日:zoj疯狂刷题刷题。

6月:前半月继续看书,看LPI考试,看算法导论着重学习算法课程,看看英语,争取把去年490的英语六级成绩提高50分。后半月复习考试,争取全部搞定。

7月:实习。70%会在导师实验室或者公司干苦力。月底考掉LPI1和LPI2。

8月:实习。应该会抽出半个月时间回家看看,顺便把驾照考掉。准备好简历,着手找工作。

9月:开学。补选电路原理,数字电子技术,线性代数,c#程序设计,软件体系结构十分左右的课程。看看直博cad有没有可能,做好做面霸笔霸和被bs的准备。

10月-12月:顺利的话在11月应该能找到一份工作。最迟在12月份搞定。


至于2011,毕设和毕业旅行。大兴安岭,内蒙新疆,东南亚,中东,印度尼泊尔,心有多大,世界就有多大。

“天大地大,不如我的车轮大;水美山美,不过我的莫莫美。”

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。




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee