MENU

c/cpp

笔记:使用qsort进行多字段排序

有一段时间没写东西了。

OJ上,评论里都说这是一个水题。事实上,确实也不难。这是NOIP2009普及组的第二题,普及组,第二题,你觉得呢。题目描述摘录如下:

世博会志愿者的选拔工作正在A市如火如荼的进行。为了选拔最合适的人才,A市区对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第$m\times 150%$(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。
现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。

【输入】 输入文件名为score.in
第一行,两个整数nm($5\leq n\leq 5000$,$3\leq m\leq n$),中间用一个空格隔开,其中n表示报名参加笔试的选手总数,m表示计划录取的志愿者人数。输入数据保证$m\times 150%$向下取整后小于等于n。第二行到第$n+1$行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号k($1000\leq k\leq 9999$)和该选手的笔试成绩s($1\leq s\leq 100$)。数据保证选手的报名号各不相同。
【输出】 输出文件 score.out
第一行,有两个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。
从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。

Read More

神器Swoole

Swoole是一个PHP的C扩展,可用来开发PHP的高性能高并发TCP/UDPServer。Swoole的网络IO部分基于多线程的epoll/kqueue事件循环,是全异步非阻塞的。
业务逻辑部分既可以像node.js一样全异步回调执行,也可以多进程同步阻塞方式来运行。这样既保证了Server能够应对高并发和大量TCP连接。又保证业务代码仍然可以简单的编写。

相信这一段引自Swoole官网的文字解答了大家的第一个问题:Swoole是什么。那么现在我要说说,我是怎么找到它的。前一段时间,有写一个简单的IM(Instant Message)的想法。因为初接触C#的缘故,客户端肯定是用.Net写了,服务端呢?考虑到服务端肯定是跑在Linux上的,C#马上被否决(不能编译成二进制可执行文件,麻烦)。有考虑过C,但是C的特性还是少了点,写起来可能比较耗时。C++呢?确实有找到一个C++的Socket库,但是…毕竟Linus是说过某些话的,而且自己也没碰过C++,上手很有难度。忽然想到了PHP。PHP是C写的,也有Socket相关的特性,但是查了一些资料之后,还是觉得有些麻烦。然而此时Swoole出现了。简单看了一下简介之后,决定就是它了。当时心情比较激动,PHP写业务逻辑,底层实现还不用管,没有比这更爽的事情了。

Read More

算法?方法?

“你要分清楚算法和方法的区别。”算法?方法?当时的我想,这我当然能分清楚了,有什么难的。然而我现在不再像当时那样简单地想了。

两个月以来一直在恶补C,那个我认为过了时的玩意儿。过了时的东西,嗯,我现在仍这样想。学了几节语法结构后,我还觉得php语法不愧是C衍生来的,确实很像。依据经验,我的想法是:我迫切地需要知道更多的函数。掌握了各种函数,各种开发何在话下!然而令人失望的是,C的库函数是那样的少,几乎是没有一个真正实用的库函数嘛!为此我曾对Hans说:“C确实很适合搞算法竞赛。”言外之意是,什么都得你自己亲自动手去完成。

到这时,我有点认识到算法与方法的区别了。之前搞的Web开发复杂之处,讲究的是性能与便捷平衡的,实现简单的业务逻辑的书写。然而现在则是来编写程序执行人类计算起来费劲的实际问题了。初学简单算法时,我曾用1行php完成了字符串反向的问题(NOIP普及组第一题)。事实上这确实很简单,用C或Pascal也就十几二十行代码的事。我还曾用5行php解决了判断回文字符的问题。然而老师说了这样一番话:“库函数好是好,但是我们真正要做的,应该是去知道它本质到底是怎样实现的。”我似乎有些明白了。群里曾讨论过“发明轮子”的问题。没错,实际应用里重复发明轮子是愚蠢的,然而当我们要深入理解程序,学习基础时,这就明显变得尤为重要了——至少你要依葫芦画瓢地造个轮子出来。

Read More