第一个是cnbeta上看到的这个关于雅虎的:
另一个是Dai牛给我的这个关于某些交往行为的:
被雷翻了...所以不评论了.
首先提一句,FCKeditor真庞大,但也真好用.
这两天被一系列问题困扰,还好今天终于有了些头绪.
要特别感谢winsty和wincss.
主要的问题就是,我希望以后能够写出一些小的GUI程序而不是一直写Console Application,可语言的选择成了难题.
首先,我有一定了解的语言有三种:VB,Pascal和C++.VB以前自学的,掌握不是很深,语法也基本忘掉了;Pascal是学得最深的,可惜Object Pascal基本没啥了解,只能简单的写一个Object玩;C++刚开始接触,对class之类的东西没有太多了解.
然后呢,我希望在VB,VC++,VB.NET,VC.NET,VCS.NET中选出一个.被一群人来回忽悠了好久,发现似乎我以前一直不太喜欢的.NET才是王道,于是想尝试一下VC.NET.可惜写一个程序加几个控件就一直没有编译成功,这才明白VC.NET不能当作VB来学.而对于所谓的"VB的风格+C的语法"的C#,问了几个人,褒贬不一.而对于我学习它是否合适,有人说没学好C++的话就别提C#,但有人说继承什么的东西用用就会了.
说实话,这种东西真的很折磨人.作为这方面的菜鸟,根本不知道从何下手.希望有人讲,但是实际上根本没人来讲.真不知道那些能随手写出一个挺复杂的程序的人难道都是自己在C#里随便试出来的?!不能理解.
于是决定现在的GUI先暂时用比较熟悉的VB6来写,如果需要复杂的处理用C++写个console再用VB调用.
几年前还是很先进的思想,竟然这么快就过时了.太诡异了.
阅读到这篇文章的大牛,如果你对学习这些东西有什么好的建议,或者你有什么自己学习时的经历,希望能够告知我.我在这里表示衷心的感谢!
作为一个迷茫的菜鸟,才发现有人带是多么重要!
--------------------------------------请当作我是一个分隔线--------------------------------------
FCKeditor竟然可以直接在HTML里写pre标签,很猛.决定以后写代码就用后台的FCKeditor了.
最近开始领略到STL的强大了.但是没有一个方便易查的STL手册,很无奈.发现www.cppreference.com很不错,可惜没有网络的时候它就成了个摆设.
很膜拜能想到迭代器这个概念的人.太猛了.
然后今天才知道下次SRM竟然是周三早晨9点.决定不上课去了,做SRM...
和Nxun,jl都说过了,过段时间等Nxun回来就组队做比赛.
要开始恢复手感了.
暂时说这些吧.
本文根据经典的TC教程完善和改编。
TopCoder:http://www.topcoder.com/
基本规则
TopCoder的比赛类型很多,最常见的是周赛SRM(Single Round Match),另外还有TCHS SRM(TopCoder High School SRM,题目和SRM一样,仅限中学生参加,参赛者水平较低,据说涨rating很容易),马拉松(Marathon Matchs),还有TCOpen(每年两次的大比赛)之类的比赛。因为大多数人都在做SRM,所以本文介绍的TC比赛即为SRM。
SRM的规则总结起来就是一句话:75分钟做完3道难度递增的题。
TC的每个用户(handle)都有自己的积分(rating),从0-3000+不等。成绩越好,分数越高。
积分与颜色的对应为:白色——未参赛(unrated);灰色——0~899;绿色——900~1199;蓝色——1200~1499;黄色——1500~2199;红色——2200+。另外排名最高的几个人在TC客户端中会变成红色靶子图标。
比赛分为两个Division,Div I和Div II。白色灰色和绿色的参加Div II,蓝色黄色和红色的参加Div I。Div I的题要比Div II难许多,一般DivII的最后一题和Div I的第一或第二题是一样的。无论是Div I或Div II。三道题目的Score一般为250, 500和1000。
TC的计分规则很诡异,可以见http://www.topcoder.com/wiki/display/tc/Algorithm+Competition+Rating+System,但基本是没人看的懂。不过,TC积分规则的基本思想很简单。
首先是SRM每道题的计分规则。题目从打开开始计时,随着时间的流逝,你这道题目可能得到的分数也越来越少。不过分数减少的速率会逐渐变慢(有人说是先快后慢再快再慢,我不清楚到底哪个是对的,不过总体趋势是越来越慢),一般1000分的题目在降低到300分的时候就基本不会再下降太多了。每道题点击Submit才算正式提交,如果Submit之后发现错误,还可以再次点击Submit修改提交,不过这样会扣除这道题一定的分数。
其次是TC的计分规则。复杂的数学公式很难看懂,但大概的计分思想是:根据此次比赛的得分算出一个这次比赛的rank,然后和以前的rank做比较,求出一个期望的rank,再根据这个期望的rank调整rating。而有时也会出现考得很砸但依然涨rating的情况,不过总体来说TC的计分公式是十分稳定的。
运行环境
TC的客户端是一个Java程序,所以需要JRE(Java Runtime Environment)或者JDK(Java Development Kit)来运行。如果平时不写Java程序的话,装JRE就可以了。毕竟JDK比JRE大一个数量级,下载慢。安装照着提示完成就行了。推荐使用1.4.1以后的版本,因为带了java web start,可以快速登陆。具体方法下一部分讲。
JRE下载地址(中文):http://www.java.com/zh_CN/download/index.jsp
注册
原文在注册的地方没有详细说明,但很多人似乎对注册都有疑问。所以这里我来注册一个小号,并通过整个过程讲解如何注册。
首先打开http://www.topcoder.com/tc(本文后面TopCoder的主页都指这个网址),然后点击右上角的Register Now(没看到?你可能看到了一个Login,目光向下挪一点,那个红底白字的“Register Now”就在下面)。接下来会弹出http://www.topcoder.com/reg这个页面,因为我们要参加SRM,所以选择第一个,Competition Registration。如果要参加TCHS可以选择第二个High School (Secondary School) Registration。这些以后都可以更改(这里没有选的如果以后要选上,只需要更新个人设置并挑勾;如果选上的要撤销选择则需要点一个“Unregister”的链接)。这里选择项目的多少和后面的页面需要填写内容的多少相关,本文以只选择第一项为例。
需要填写的项目和对应的中文翻译如下:
* Given Name: 名
* Surname: 姓
* Address1: 地址1
Address2: 地址2
Address3: 地址3(如果一行写不开,就在三行中分别写)
* City: 城市
State (US Only): 地区(不在美国就不用选)
Postal Code: 邮编
Province: 省
* Country: 国家
* Country to represent: 代表国家(不知道啥意思,中国人两个都填China就行)
* Timezone: 时区(选Asia/Chongqing)
Phone Number: 电话号码
* Email Address: 电子邮件
* Confirm Email Address: 确认电子邮件地址(就是把电子邮件地址重新打一遍)
Email Notifications: 邮件提醒(就是它给你发邮件提醒什么东西)
- Algorithm Competitions 算法比赛,就是SRM和TCOpen
- Software Development Opportunities 貌似就是有软件开发的项目就告诉你
- Employment Opportunities 工作机会
- TopCoder News & Events 新闻
* Enable Member Contact: 允许成员联系(似乎就是说是不是让别人在TC上能找到你)
* Show / hide earnings: 显示/隐藏收入(大概是说别人是不是能看到你赚了多少钱,TC的比赛可是有钱赚的)
* User Name: 用户名(下面的话提醒你一定不要填错,因为注册多个用户是不符合规定的。据说有人因为别人在TC客户端和他打招呼说“怎么你拿小号上了”,那个人的号就被封了)
* Password: 密码
* Confirm Password: 确认密码
* Secret Question: 密码找回问题(找回密码时需要回答这个问题,注意至少要8个字符长,而一个中文字似乎算一个字符,所以最后可能要打几个问号补齐长度)
* Secret Question Response: 密码找回问题答案
Quote: 座右铭,就是个签名档之类的东西
* Student/Professional: 学生/职业程序员
* = required 带*的项目必填
填写之后点Term of Use下面的I Agree,再点Submit,完成提交。除了用户名别的以后似乎都可以改。
接下来进入Demographics页面,这个大概相当于一个注册用户情况调查。
* Age : 年龄
* Gender : 性别(Male男,Female女)
* Ethnic Background : 民族背景(似乎选Asian or Pacific Islander就行吧……)
* Primary Interest in TopCoder : 在TC的主要兴趣,看不懂的就选第一个吧,那个是说你的兴趣在奖金……
* Shirt Size : T-Shirt大小(有的比赛会给排名前N的选手发T-Shirt,这里你需要选择适合自己的大小,如果选最后一个说明你不想要T-Shirt,人家也不发你了。TC的T-Shirt还是挺好看的,比AStar的好)
* College Major : 大学的专业
* College Major Description : 这个不知道啥意思,随便填点东西就行……
* Degree Program : 学位(从上到下分别为:准学士,学士,硕士,博士,中学生)
* Graduation Year : 毕业年份
* Graduation Month : 毕业月份
* Clubs / Organizations : 组织(一般选None,可以按住Ctrl点鼠标多选)
Other Clubs / Organizations : 其它组织
* School: 学校(点Choose School选择学校,可以搜索,不过为啥shanghaijiaotong university才2个人注册?!)
* Show / hide my school: 显示/隐藏我的学校
GPA: 不懂的自己百度去……
GPA Scale: 同上
Resume: 简历
* How did you hear about TopCoder?: 你怎么知道的TC,如果选了“Member Referral”的话,需要填写那个人在TC的用户名(欢迎填写sqybi~)
* = required
点Submit,进入Confirm页面,确认信息。如果有误可以点Edit修改,否则点最下面的Confirm提交。
接下来进入Success,提示你已经发送一封邮件到你的邮箱中,你必须去点击里面的链接激活用户。激活之后就可以使用这个用户了。
登录
登录的方法一般都是使用Java Web Start。
在TopCoder主页(http://www.topcoder.com/tc)最下方有一段话,第一句是“Load the Arena as an Applet or as a Java Web Start Application”。点“Java Web Start Application”,就会自动下载登陆需要的文件(一个jnlp格式的文件,本机装了JRE/JDK才能打开)。经测试在IE7下这个链接似乎不管用,在Firefox 3下正常。
然后运行下载下来的jnlp文件,就打开了TC客户端。第一次运行和有更新的时候会自动下载安装程序,等待即可,很快。
在我这里有时会提示“语法错误”,但没有任何影响,点“确定”就可以。启动可能会慢一些,耐心等待。
然后输入用户名密码,在Connection的地方选合适的登录方式(一般Direct就行,如果不行的话可以试试别的或者用AUTODETECT自动检测),在PROXY处设置代理,点GO登陆。这时可能还会提示语法错误,再确定就行,这个也没有什么影响。
界面
下面的图们来自原文,很经典,不打算改动了。请使用等宽字体浏览。
主界面:
-----------------------------------------------------------------------
| Advertisements............. |
-----------------------------------------------------------------------
| Main | Lobbies | Options | Practice Rooms | Active Contests | Help ||
-----------------------------------------------------------------------
| | Clock | |
-----------------------------------------------------------------------
| Rating Key | Who's here | Chat Area |
| . | | |
| . | | |
| . | | |
| . | | |
| . | | |
|------------| | |
| MESSAGES | | |
|------------| | |
|LEADER BOARD| | |
|------------| | |
| | | |
| | |-------------------------------------------|
| | | >>_______________________________________ |
-----------------------------------------------------------------------
Advertisements 广告。
菜单项:
- Main里可以看在线名单和找人。
- Lobbies基本用不着,因为用户一般都在Chat Room 1。
- Options里是一些选项和颜色设置。
- Practice Rooms里有大量的练习,都是以前比赛的题目
- Active Contests只有有比赛的时候才有用,显示当前正在进行和将要进行的比赛以及比赛注册之类的东西。
- Help里是....不用说了吧。
Rating Key: handle的颜色是随着积分而改变的,这里显示了积分与颜色的关系。
MESSAGES: 比赛的时候这里有注册提示和clarification。
LEADER BOARD: 看每个room的最高分。
Who's here: 当前room里的人。
Chat Area: 聊天。
练习
在Practice Rooms里随便选择一个room就可以进入practice了。
界面与主页面稍有变化,但基本相同,略去不画。主要的变化就是Who's here分成了两块,多了一块Who's assigned。这块显示的是谁被分到了这个room。因为是练习区,所以只要是在这里打开过题的都算是assigned。而在正式比赛中room是由TC分配的。这里显示的是被分配到这个room的人。界面上还有一个变化是Chat Area顶上多了三块。最左边的是一个下拉菜单。里面有三个分值,选择后就可以打开相应的题目。中间的summary可以看这个room里每个人的提交情况。
在practice room里只有coding phase。提交后要判的话需要自己选择Practice Options(多出来的菜单项)里的Run System Test。
比赛
每次比赛(除了1年两次的大赛)都需要在赛前3小时-5分钟之间登陆注册方可参加,注册需要在Active Contest菜单中,选择你要参加的那个比赛,再选择Register。注意比赛前5分钟注册停止,这时候如果没有注册就不能参赛了。而注册了没有打开题目也视为没有参赛,rating不变动。
然后TopCoder开始根据每个人的rating分配room,一般每个room都有高手和菜鸟,只不过如果你的rating高,和高手分在一起的概率高一些(当然也不一定是这样,比如我上次就和yuhch大牛分在了一起……)
分配完成后,Active Contest菜单中Register一项变成Enter。选择后可以直接进入你被分配到的room。Active Contest菜单最下面还有一项暗色背景的Room子菜单,可以进入各个room溜达。
进入自己room的时候一般离开始只有3分钟左右,静一下心就可以直接开始比赛了。coding phase的过程与practice基本相同。注意每题的得分是和用的时间相关(见前面的计分规则),而时间是从你打开该题开始算的。所以一题做完后可以不急着打开下一题,先放松一下。
75分钟的coding后是5分钟的intermission,这段时间是用来休息和聊天的。
然后就是最刺激的15分钟challenge phase,也就是通常说的cha人。打开summary,双击别人的各题Score可以打开那题的程序,如果觉得有错误就可以点左下的Challenge然后输入你认为他会错的输入数据,如果输入数据合法那么系统会用标程的输出和这个程序的输出对比,如果出现不同则cha人成功。成功的话你能得到50分,对方该题分数为0;而如果失败了,你会被减去25分。每个程序只能成功被cha一次,也就是说,如果有人cha掉了这个程序,你就不能再次cha。但是一个人可以cha某个程序很多次,直到这个程序被cha掉或者你放弃。
Challenge结束后就是System Test。这个过程一般比较慢,可以先走开做其他事,过20分钟再回来看结果。System Test中的测试数据有两种:一种是出题者准备的测试数据,一种是成功cha掉别人的数据。所以,TC中很少出现有bug的程序能通过System Test的情况。
结果出来后再过一段时间,就可以看到一系列message,比如rating更新了,新的practice room建好了以及可以通过主页查看这次比赛的数据了。这时比赛就宣告结束。
注意事项
1.在TC主页(http://www.topcoder.com/tc)上可以看到Next SRM,这是下次SRM的时间。注意我们的时间与他们刚好相差12小时,因此若时间是7月9日9:00 PM的话,这里是7月10日9:00 AM。还有要注意的是美国有夏令时,非夏令时的时候,还要再加1小时,就是7月10日10:00 AM。
2.Practice Rooms里写的程序只要点SAVE就可以保存,下次login的时候还可以看到,但是比赛时候的程序必须Submit才可以在coding phase结束后保存(coding phase结束前还是只要SAVE就可以的)。
3.若想cha别人的程序,自己必须是正分(0分也不行),所以若没有一题有正确的程序但有很好的数据的话,随便交一道看上去正确的程序,然后在challenge的时候快下手,就可以赚到了。
4.客户端自带的编辑器只有基本的编辑功能和编译及测试功能,所以若觉得不方便的话可以使用parser和plugin,TC主页最下面有plugin的连接。每个plugin都有详细说明文档,这里不再赘述。
5.TC的FAQ:http://www.topcoder.com/?&t=support&c=index
6.最后一条,千万不要作弊,会有严重的后果。
SRM的输入输出
SRM是不用标准或文件输入和输出的,只要写一个类的一个成员函数。也就是说,你需要编写的并不是一个完整的程序,而是一个类。
输入是成员函数的参数,输出用return,所以经常需要STL中的vector和string。
因为TC的系统并不测试标准输出,所以标准输出可以当调试用。
下面以SRM 413 Div 2的1000分题目介绍程序的写法。
题目如下(选择不同的语言,题目描述会略有不同,本文以C++为例):
Problem Statement
NOTE: This problem statement contains subscripts that may not display properly if viewed outside of the applet.Let's consider an infinite sequence A defined as follows:
A0 = 1;
Ai = A[i/p] + A[i/q] for all i >= 1, where [x] denotes the floor function of x. (see Notes)
You will be given n, p and q. Return the n-th element of A (index is 0-based).Definition
Class:
InfiniteSequence
Method:
calc
Parameters:
long long, int, int
Returns:
long long
Method signature:
long long calc(long long n, int p, int q)
(be sure your method is public)Notes
- [x] denotes the floor function of x which returns the highest integer less than or equal to x. For example, [3.4] = 3, [0.6] = 0.Constraints
- n will be between 0 and 10^12, inclusive.
- p and q will both be between 2 and 10^9, inclusive.Examples
0)
0
2
3
Returns: 1A[0] = 1.
1)
7
2
3
Returns: 7A[0] = 1; A[1] = A[0] + A[0] = 2; A[2] = A[1] + A[0] = 2 + 1 = 3; A[3] = A[2] + A[1] = 3 + 2 = 5; A[7] = A[3] + A[2] = 5 + 3 = 8.
2)
10000000
3
3
Returns: 327683)
256
2
4
Returns: 894)
1
1000000
1000000
Returns: 2This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved.
下面是我写的一个错误算法的程序,仅供参考格式用:
#include <string>
#include <vector>
class InfiniteSequence {
public:
long long calc(long long n, int p, int q) {
if (n == 0)
return 1;
else
return calc(n/p, p, q) + calc(n/q, p, q);
}
};
趁着我的迅雷正在跑全速,用WLW本地写下这篇文章.
这一周过的可真幸福,刚开始没有地方待就在教室里无所事事,后来给我们开了屋子就到屋子里继续无所事事.果然一没有压力就懒下来了,刚开始还听听课,现在什么课都不想听(说实话,都是复习做卷子也没啥好听的),不过有时候zher的数学课还是会去听听的.但主要是因为zher比较好玩而已.
自己的体力也真的不行了,昨天自己练了一节课投篮,基本是在走,不过也基本一直在投,没停下来.中间尝试连续按照Nash的那个20分钟训练强度练,果然不到3分钟就坚持不了了.然后回家的时候胳膊就有些酸,今天又踢了老长时间球(半场5v5,也够累的了...),打了老长时间球(3v3半场...因为踢球费体力太多,那时候我就基本不管防守了...4分1抢断1盖帽...).回家之后休息了好长时间才让肌肉里的乳酸渐渐消失...脚踝手腕还疼呢.
英文的算法导论基本没怎么动,根本看不下去.不在状态.
几次Vijos的邀请赛,报名了都没参加.今天好不容易想参加一次,结果第一题想用STL发现没法用,于是又懒得做了...
我还从没定过什么具体的计划,我知道这不是好习惯,但定计划之后会感觉十分的拘束.不过没有计划也不好,于是干脆定一个比较模糊的大体学习方向吧.
1.C++
这个显然不能少.C++ Primer的前半本基本看完,后半本扫了一遍,下面就是通过练习熟悉STL了.正在找好的STL函数总结,不过还没找到.
2.UVa
200道题要继续下去,不过一道题一个题解真的很恶心...我也发现了经常更新的feed是多么烦人...于是决定题解不发了,做题进度请直接到这里去看.
3.VC
之所以和C++分别列出来,是因为我决定开始学习VC 6.0的可视化编程.总是写命令行的程序也挺烦人的.打算过段时间给老师们写个成绩排名的程序...省的每次都用Excel排好几个表,麻烦死了...
4.PHP/ASP.NET
这个还没决定,不太喜欢ASP.NET,可是学校的那个什么五科竞赛的网站如果要放在学校服务器一定得用ASP.NET...初步打算是学PHP,然后那个网站让学校去租一个服务器(说不定我还能搞到点地方当网盘呢^_^)...
5.英语
不想说什么...我尽力而为.不过得先把状态调过来,现在让我学英语不太现实...
6.NOIP
这次NOIP本来想争取搞个满分的...现在看也不太现实...到时候状态比现在好多少呢...我也不知道...
7.体育
足球篮球吧...就当是玩了.篮球准备练练投篮,毕竟以前基本没打过...过人什么的不打算练,反正没有基本功,也不想多练...只是如果以后要打别空位都投不进就好...
暂时想到这些.如果有别的再补充吧.
刚王励勤赢了佩尔森...乒乓球中国拿了所有能拿的奖牌...orz...
另:周一一定要记得带U盘给zbw...提醒自己下,顺便给sdy等人一个8g的机会.
水题,枚举即可.
第一次提交WA,没有注意这道题并不是Special Judge,如果有多组顺序符合要求,需要输出字典序最靠前的一组.
虽然用了string,不过代码写的还是很垃圾.
/* UVa 102; Ecological Bin Packing - sqybi's code */ //for my winsty #include #include using namespace std; const int nn = 3; int t, res, now; int a[nn][nn]; bool u[nn]; char ch[nn] = {'B', 'G', 'C'}; string ress, nows; void get(int i) { if (i == 3) { if (now > res || (now == res && nows < ress)) { res = now; ress = nows; } return; } for (int j = 0; j != 3; ++ j) if (! u[j]) { u[j] = true; now = now + a[i][j]; nows += ch[j]; get(i+1); nows = nows.erase(i, 1); now = now - a[i][j]; u[j] = false; } } int main() { while (scanf("%d", &a[0][0]) != EOF) { t = a[0][0]; for (int i = 0; i != 3; ++ i) for (int j = 0; j != 3; ++ j) if (i + j) { scanf("%d", &a[i][j]); t += a[i][j]; } res = 0; now = 0; nows = ""; memset(u, false, sizeof(u)); get(0); cout << ress << ' ' << t - res << endl; } }