宝剑锋从磨砺出——使用在线评测平台磨砺C#使用能力

学数学的时候,我们通常会通过大量的练习题来巩固所学知识;其实学习程序设计设计语言也不例外。那么如何通过练习去磨砺自己的C#使用能力呢?一个方法是参与到实际的软件项目开发中,而另一个更加直接的方法则是“做题”。

  去哪里找练习题呢?听过或接触过ACM/ICPC(http://cm.baylor.edu)的读者,应该不会对Online Judge(http://en.wikipedia.org/wiki/Online_judge)(以下简称OJ)陌生。OJ是一个在线评测平台,包含了大量的程序设计题目,在这个平台上用户可以提交源代码,OJ会对其进行编译和执行,并通过预定义的测试数据来验证源代码是否正确。在国内,比较有影响力的OJ有POJ(http://acm.pku.edu.cn/JudgeOnline/)和ZOJ(http://acm.zju.edu.cn/onlinejudge/)等。但可惜地是,它们只支持C、C++、Pascal、Java等,却没有给C#一席之地。尽管如此,还是有不少国外的OJ支持着C#。下面我就列举了三个优秀的在线评测平台,它们在一定程度上很好地支持了C#。

 

Timus Online Judge

Timus在线评测平台主页

  Timus Online Judge(以下简称TOJ) 地址是 http://acm.timus.ru/。它是一个俄罗斯的在线评测平台,上面汇集了大量程序设计竞赛的套题。此外,它也是为数不多一直提供最新C#编译功能的OJ。下面是TOJ关于支持C#编译的一些历史:

  • 2006年12月31日开始支持使用C#源程序提交解题程序;
  • 2008年02月08日以前均在使用Microsoft Visual C# 2005编译器;
  • 2009年08月04日以前均在使用Microsoft Visual C# 2008编译器;
  • 2009年08月04日开始至今使用Microsoft Visual C# 2010编译器

  TOJ服务器目前的C#编译命令为:

csc /o+ /d:ONLINE_JUDGE /r:System.Numerics.dll

  先简单介绍一下这个编译命令什么意思。开头的csc实质上是csc.exe,它是C#编译器的名称,在安装完.NET Framework之后就可以在安装目录找到。后面跟着的一串命令“/o+ /d:ONLINE_JUDGE /r:System.Numerics.dll”是所谓的编译器参数。

  • “/o”是“/optimize”的简称,该选项可以通知CLR在运行时是否优化代码。这里的“/o+”即为启用优化,它可以使得输出文件更小、更快且更有效;
  • “/d”是“/define”的简称,它可以用来定义源文件中的一个或多个符号名称,功能类似于#define预指令定义一个宏。这里的“/d:ONLINE_JUDGE”就是将ONLINE_JUDGE定义为所有源代码文件中的一个符号。这样就相当于用户不需要做任何事情就可以在源程序序中直接使用ONLINE_JUDGE进行一些预处理操作;
  • “/r””是“/reference”的简称,该选项可以将指定文件的public类型信息导入到当前项目中,从而可以从指定的程序集文件引用元数据。因此“/r:System.Numerics.dll”就是将System.Numerics.dll程序集导入到当前项目中。为什么非要把这个程序集导入呢?因为.NET Framework 4.0新引入的这个程序集里引入了两个非常有用的结构,它们就是BigInteger和Complex。前者可以支持任意大的带符号整数的加减乘除等运算;后者可以支持复数运算。这两个结构可以给你做题时带来极大的便利。

  下面让我们一同走进TOJ,看看如何通过它来提高自己的C#使用能力。首先要做的事情就是在TOJ上注册一个账号(http://acm.timus.ru/register.aspx)。注册完毕会得到一个Judge ID,接着便可以打开“Problem Set”并挑选一道题目进行解答。以1000. A+B Problem(http://acm.timus.ru/problem.aspx?space=1&num=1000)为例:题目大意就是对给定两个数a和b,输出它们的和,要求程序必须在1秒内运行完,且最多只能使用16M的内存。读题完毕,相信大家都可以很轻松地写出如下代码:

view source
print?
01using System;
02  
03public class TOJ1000Sum
04{
05    private static void Main()
06    {
07        string[] tokens = Console.ReadLine().Split(' ');
08        Console.WriteLine(int.Parse(tokens[0]) + int.Parse(tokens[1]));
09    }
10}

  点击“Sumbit solution”,选择要提交的源代码文件或者直接将源程序粘贴到文本框中、填入刚刚申请的Judge ID、选择“Language”为C#、点击“Submit”按钮之后就可以看到评测的结果了,如:

Timus在线评测平台提交状态

  上述状态的意思是:RujinCao于2010年8月10日21点35分42秒提交了题号为1000的程序,该程序使用C#语言编写,运行时间为109毫秒,占用内存613K,最重要的是该程序通过了全部的测试数据!除了Accepted外,你还可能会常常碰到如下的返回状态:

  • Compilation Error 编译错误
  • Wrong Answer 程序不正确,无法通过全部的测试数据
  • Time limit exceeded 程序运行时间超过了规定的时间限制
  • Memory limit exceed 程序运行内存超过了规定的内存限制
  • Crash 程序运行有异常

  更多信息可以阅读TOJ的FAQ(http://acm.timus.ru/help.aspx?topic=faq)。

 

TopCoder

TopCoder主页

  TopCoder网站地址为http://www.topcoder.com/tc 。它是一个美国的网站,主要以竞赛形式外包软件设计、软件开发等项目。不过这里要介绍的并不是如何开发软件,而是介绍TopCoder的算法竞赛部分。

  首先打开TopCoder网站,点击右侧的“Register Now”或者直接输入网址https://www.topcoder.com/reg/ 进行注册。注册完毕,点击左上角的“O(n)”图标,并按照提示安装必要的Java组件,之后就可以下载并打开TopCoder竞技场软件(TopCoder Arena),如下图所示:

TopCoder竞技场软件主界面

  输入注册号的账号和密码,点击“GO”,会进入到竞技场的休息聊天室(Lobby Chat Room),在这里你可以和当前登录的其他用户进行聊天(TopCoder用户分布于世界各个国家)。选择菜单“Practice Rooms” –> “2. SRMs”,接着挑选要练习的一个场次,如“SRM 454 DIV2”,就可以进入到练习区域(注:SRM全称为Single Round Match。TopCoder会在每月举行4到5次的SRM在线竞赛,每场竞赛分两个级别:DIV1和DIV2,前者适合于高等级的用户,后者适合于分数较低的用户。对于初学者建议选择DIV2进行练习),如图:

TopCoder SRM454 Div2

  接下去选择“Select one”下拉框,会看到250,500和1000的字样,这代表了此轮竞赛有三个题目,分数分别为250分,500分和1000分,分数越高,难度越大。当用户打开某一道题目之后,分数就开始自动减少,换句话说,提交源程序越快则分数越高。TopCoder允许用户多次提交同一道题目,但是每次提交都会扣取一定的分数。下面我们打开250分的题目:

SRM454 Div2 250分题

  阅读完题目大意“Problem Statement”后,就可以在代码区域“Coding Area”编写解答程序。要注意地是,TopCoder与普通的OJ不一样,它要求用户提交的程序的类名、方法名等必须完全符合题目中的要求。以这道250分的题来说,题目要求我们类名必须为“MinimalDifference”,方法名必须声明为“int findNumber(int A, int B, int C)”,而且必须是public类型。

  这道题目大意是“给定三个整数A,B和C,要求返回区间[A,B]之间的一个数字X,使得X各位数字之和与C各位数字之和的绝对值最小,如果存在多个这样的X,返回最小的一个。其中A,B,C的范围均在[1,1000000000]之间,且保证B减去A的值在[0, 100000]之间。”

  我们可以很轻松地完成下面的代码(注意:TopCoder中的.NET Framework 版本仅为2.0.50727,因此有许多C#的新特性在这里无法使用):

view source
print?
01using System;
02  
03public class MinimalDifference
04{
05    private int GetDigitSum(int n)
06    {
07        int sum = 0;
08        while (n != 0)
09        {
10            sum += n % 10;
11            n /= 10;
12        }
13        return sum;
14    }
15  
16    public int findNumber(int A, int B, int C)
17    {
18        int sumC = GetDigitSum(C);
19        int minDiff = int.MaxValue;
20        int X = A;
21        for (int i = A; i <= B; i++)
22        {
23            int sum = GetDigitSum(i);
24            int diff = Math.Abs(sum - sumC);
25            if (diff < minDiff)
26            {
27                X = i;
28                minDiff = diff;
29            }
30        }
31        return X;
32    }
33}

  确保“Language”选择的是“C#”,之后点击“Compile”,系统会告诉你编译是否有问题,如果没有问题,可以点击“Submit”提交源代码(注:这里还有一些其他非常还用的功能,尤其是“Test”,读者可以自行实践”)。接下去系统会在聊天区给出这次提交得到的分数,但是尽管如此,我们并不能保证提交的程序一定正确。幸好TopCoder提供了测试功能,点击菜单上的“Practice options”->“Run System Test”, 如果一切顺利,我们会看到一个绿色的分数(如图所示);否则会看到一个红色的分数,这说明源程序中有错误,需要修改。

SRM454 Div2 250分题测试结果

  如果读者实在无法解答某一道题目,一种方法可以通过TopCoder主页左侧栏中的“Competitions->Algorithm->Statistics->Match Editorials ”或直接输入网址http://www.topcoder.com/wiki/display/tc/Algorithm+Problem+Set+Analysis 中找到对应比赛的解题报告;另外一种方法可以打开Arena中的“Summary”功能查看其他比赛选手的代码进行学习。

  TopCoder Arena功能丰富,我所介绍的只是冰山一角,更多功能期待读者们自己去发掘。

 

CodeForces

Codeforces 主页

  Code Forces地址在http://codeforces.com/ 。这是2010年刚兴起的一个在线评测网站,由俄罗斯人创建。它综合了TopCoder和普通OJ的优点:以TopCoder比赛的形式进行,以普通OJ的文件方式提交源程序。下面我将简单介绍一下如何在CodeForces上使用C#进行练习:
  和前面一样,首先要做的是注册一个账号,CodeForces的注册网址为http://codeforces.com/register 。注册完毕之后,我们可以挑选一场比赛进行练习,下面以Codeforces Beta Round#25(Div. 2)为例(http://codeforces.com/contest/25)。点击右侧的“Register for practice”以注册这次练习。打开B题 Phone numbers(http://codeforces.com/contest/25/problem/B),并仔细阅读题目。大意就是:“给定一个n位的电话号码(2 ≤ n ≤ 100),将其分割成任意两位或三位的组合以方便记忆。如:7位的电话号码1198733可以分割为11-987-33或119-87-33或11-98-733,只要输出一种分割即可。”相信大家可以很轻松地完成如下的类似代码:

view source
print?
01using System;
02  
03public class Codeforces25B
04{
05    public static void Main()
06    {
07        int n = int.Parse(Console.ReadLine());
08        string phoneNum = Console.ReadLine();
09        int i;
10        for (i = 0; i < n - 3; i += 2)
11        {
12            Console.Write(phoneNum.Substring(i, 2)); Console.Write("-");
13        }
14        Console.WriteLine(phoneNum.Substring(i));
15    }
16}

  选择“Language”为“C# Mono 2.6+”,并选择要提交的源代码文件,点击“Submit”提交之后即可以看到结果,如下:

CodeForces 提交状态

  这里,读者们也许会有些疑问,刚刚提到的“C# Mono 2.6+”是何物,它又和微软的C#有什么关系?其实,C# Mono是微软C#的一个开源实现,它的目标是跨平台和跨语言,目前由Novell公司主持。更多关于Mono的信息请关注http://mono-project.com/Main_Page

  当然,除了上面介绍的三个支持C#的在线评测平台以外,还有着其他一些OJ也支持C#,不过大体上做题的方式都相近,不再一一列举。为了帮助读者们更好地去了解如何在上述的三个OJ中做题,我特意创建了一个Blog(http://newacm.info/)用以跟进分析解答它们中的习题。如果大家有问题,可以直接在Blog中留言或者直接发送邮件给我(newacminfo AT gmail.com)。好了,到这里我相信读者们对使用C#“做题”练习也有了一定的认识,接下去就是你们在OJ平台上一展身手的时候了!最后希望大家都能在练习中将自己的C#使用能力磨砺的越来越精纯!

转载于:https://www.cnblogs.com/yqskj/articles/2005052.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java多线程学习-java.util.concurrent详解(一) Latch/Barrier

2019独角兽企业重金招聘Python工程师标准>>> Java1.5提供了一个非常高效实用的多线程包&#xff1a;java.util.concurrent, 提供了大量高级工具&#xff0c;可以帮助开发者编写高效、易维护、结构清晰的Java多线程程序。从这篇blog起&#xff0c;我将跟大家一起共同…

55种网页常用小技巧(转载)

55种网页常用小技巧乖的无聊 发表于 2005-4-18 13:18:09  1. οncοntextmenu"window.event.returnValuefalse" 将彻底屏蔽鼠标右键<table border οncοntextmenureturn(false)><td>no</table> 可用于Table2. <body onselectstart"retu…

Go学习笔记—锁(sync包)

并发安全和锁 1. sync.Mutex—实现互斥锁 var lock sync.Mutex var x int func add() { //这样&#xff0c;在多个goroutine同时访问x时&#xff0c;才不会造成x错误for i : 0; i < 5000; i {lock.Lock() // 加锁x x 1lock.Unlock() // 解锁} }2. sync.RWMutex—实现读写…

switch…case语句注意事项

1、 case 的值必须是常量表达式&#xff0c;不允许使用变量。2、如果一个 case 子句为空&#xff0c;就可以从这个 case 跳到下一个 case 上&#xff0c;这样就可以用相同的方式处理两个或多个 case 子句了(不需要 goto 语句)。3、在C#中&#xff0c;可以把字符串用作测试变量。…

Java Websocket实例

2019独角兽企业重金招聘Python工程师标准>>> 介绍 现很多网站为了实现即时通讯&#xff0c;所用的技术都是轮询(polling)。轮询是在特定的的时间间隔&#xff08;如每1秒&#xff09;&#xff0c;由浏览器对服务器发出HTTP request&#xff0c;然后由服务器返回最新…

LeetCode 287. 寻找重复数

给定一个包含 n 1 个整数的数组 nums&#xff0c;其数字都在 1 到 n 之间&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。假设只有一个重复的整数&#xff0c;找出这个重复的数。 示例 1: 输入: [1,3,4,2,2]输出: 2示例 2: 输入: [3,1,3,4,2]输…

Go学习笔记—并发高级

Go并发机制 ​ 协程&#xff1a;一个线程可以对应多个协程&#xff0c;协程串行运行在用户空间。协程运行在线程之上&#xff0c;当一个协程执行完成后&#xff0c;可以选择主动让出&#xff0c;让另一个协程运行在当前线程之上。协程并没有增加线程数量&#xff0c;只是在线程…

设计模式C++学习笔记之十三(Decorator装饰模式)

装饰模式&#xff0c;动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;Decorator模式相比生成子类更为灵活。 13.1.解释 main()&#xff0c;老爸 ISchoolReport&#xff0c;成绩单接口 CFourthGradeSchoolReport&#xff0c;四年级成绩单 ReportDecorator&…

Android应用开发相关下载资源(2014/12/14更新)

官方终于发布了Android Studio正式版&#xff0c;Android Studio将会成为推荐使用的主要Android开发工具. (1)Android SDK (Android SDK主安装包&#xff0c;包含SDK Manager、AVD Manager、工具包tools&#xff0c;释放后的根文件夹为android-sdk-windows): revision 23.0.2ht…

分层在深一步学习

前几天自己写了写DAL层,还有Model!理解到在DAL中主要是写的数据操作,而这些操作又是基于DbHelper这个基类!而数据库的访问则写在了这个基类中,目前还没研究BLL层,不过知道其中写的是算法!在Model中写的对象的属性,还有数据的规范(据说是,呵呵).自己对分层开发很感兴趣!呵呵,加油…

程序员编程艺术:第二章、字符串是否包含问题

程序员编程艺术&#xff1a;第二章、字符串是否包含及相关问题扩展 作者&#xff1a;July&#xff0c;yansha。时间&#xff1a;二零一一年四月二十三日。致谢&#xff1a;老梦&#xff0c;nossiac&#xff0c;Hession&#xff0c;Oliver&#xff0c;luuillu&#xff0c;雨翔&a…

LeetCode—207. 课程表

207. 课程表 题目描述&#xff1a;你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课程 ai…

详解为何在嵌套ESXi环境下要求开启Promiscuous Mode

原文链接&#xff1a;http://bbs.vmanager.cn/forum.php?modviewthread&tid8688&fromuid35445在嵌套环境中&#xff0c;有时候网路不通&#xff0c;此时&#xff0c;调整Promiscuous Mode选项为Accept之后&#xff0c;网路就可以通了。之前只是知道这个选项可以保证嵌…

Rapidmind计算库性能测试

rapidmind.net提供了免费的计算库下载&#xff0c;目的是使用C metaprogramming将计算与硬件平台隔离开来&#xff0c;它提供一套运行库做底层的优化工作。为了测试其真正的性能&#xff0c;以便于在未来的渲染器中使用&#xff0c;我做了一个简单的性能测试程序&#xff0c;将…

VMware 怎么进入BIOS

2019独角兽企业重金招聘Python工程师标准>>> 虚拟机(Vmware)引导Linux虚拟机时&#xff0c;需要设置成光盘启动来引导系统&#xff0c;但是vmware默认是硬盘启动&#xff0c;所以会启动不了或者别的问题存在。所以要进bios里面设置成开机的启动顺序&#xff0c;要将…

LeetCode—208. 实现 Trie (前缀树)

208. 实现 Trie (前缀树) 题目描述&#xff1a;Trie&#xff08;发音类似 “try”&#xff09;或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补完和拼写检查。 请你实现 Trie 类…

SQL入侵恢复XP_CMDSHLL与开3389

一,用SQL连接器恢复XP_CMDSHLLE的命令 &#xff08;1&#xff09;sp_addextendedproc xp_cmdshell,dllnamexplog70.dll &#xff08;2&#xff09;首先在SqlExec Sunx Version的Format选项里填上%s&#xff0c;在CMD选项里输入 sp_addextendedproc xp_cmdshell,xpsql70.dll 去除…

java中long类型转换为int类型

由int类型转换为long类型是向上转换&#xff0c;可以直接进行隐式转换&#xff0c;但由long类型转换为int类型是向下转换&#xff0c;可能会出现数据溢出情况&#xff1a; 主要以下几种转换方法&#xff0c;供参考&#xff1a;一、强制类型转换 [java] long ll 300000; in…

中国最好的电子商务平台,75商务网成功上线

中国B2B电子商务网站多年处于停滞不前&#xff0c;行业垄断现象&#xff0c;而且非常专注于B2B方向发展&#xff0c;没有其他业务范围可以拓展。http://www.755563.com/ “ 75商务网 ”看到其中亮点&#xff0c;在原有B2B基础上增加新型模式&#xff0c;变成B2B2C形式&#xff…

SVN钩子HOOK设置自动备份,服务本地可以看到所有更新内容。

可以实现SVN本机备份。或者其他备份。关键是可以保持有一份最新的SVN文件可以查看。 实现SVN与WEB同步,可以CO一个出来,也可以直接用自动更新web目录的方法&#xff0c;我们要在svn版本库中配置钩子来实现&#xff0c;就是创建一个post-commit的配置文件&#xff0c;对其进行简…