宝剑锋从磨砺出——使用在线评测平台磨砺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;我将跟大家一起共同…

Java Websocket实例

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

Go学习笔记—并发高级

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

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

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

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

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

Rapidmind计算库性能测试

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

VMware 怎么进入BIOS

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

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

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

OSChina 周四乱弹 —— 熊孩子毁灭世界

2019独角兽企业重金招聘Python工程师标准>>> 小伙伴们赶快起床&#xff0c;开源中国要出大事啦~ 为方便大家搜索开源软件&#xff0c;开源中国决定整理 IT 公司开源软件。初步列表不一定完善&#xff0c;小伙伴们有什么意见可以向小小编或者红薯提出来~ 好啦好啦&am…

Redis主备安装

2019独角兽企业重金招聘Python工程师标准>>> 采用主备部署方式&#xff0c;Master不做数据持久化操作&#xff0c;仅Slave做数据持久化操作&#xff0c;Slave采用AOF二进制日志文件作为持久化方案&#xff0c;默认每秒持久化一次。 安装 1. 下载源代码文件redis-2…

数据库设计三大范式【转载】

数据库设计范式 什么是范式&#xff1a;简言之就是&#xff0c;数据库设计对数据的存储性能&#xff0c;还有开发人员对数据的操作都有莫大的关系。所以建立科学的&#xff0c;规范的的数据库是需要满足一些 规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为…

Visual C++2010的使用

Tools->Settings>Rest... 还原所有设置 运行程序&#xff1a;"D:\Program Files\VCExpress\Install\Microsoft Visual Studio 10.0\Common7\IDE\VCExpress.exe" 一、Visual C2010&#xff08;微软vc2010&#xff09;如何编写并运行C程序&#xff1f; 1、刚开始…

linux下时间同步的两种方法分享

为什么80%的码农都做不了架构师&#xff1f;>>> 方法1&#xff1a;与一个已知的时间服务器同步 ntpdate time.nist.gov 方法2&#xff1a;linux自动同步时间vi /etc/crontab 00 0 1 * * root rdate -s time.nist.gov 转载于:https://my.oschina.net/boltwu/blo…

.Net TCP/UDP 编程 【一】【原创】

命名空间&#xff1a; using System.Net;using System.Net.Sockets; 关键 &#xff1a; TCP /UDP连接 UDP UDP 与 tCP的主要区别在于 UDP 不一定提供可靠的数据传输。事实上&#xff0c;该协议不能保证数据准确无误地到达目的地。UDP 在许多方面非常有效。当某个程序的目标是尽…

maven配置_eclipse创建maven_maven插件配置

为什么80%的码农都做不了架构师&#xff1f;>>> 最近项目开发中需要使用maven。Maven这个东西是我2年前自学的。这2年之中基本没有使用过。现在项目需要&#xff0c;只有重新来一遍回锅肉。重新学习。经过一下午的斗争&#xff0c;一下午的各种问题各种解决&#x…

老生又长谈:HttpApplication,HttpModule,HttpContext及Asp.Net页生命周期

IIS在接到一个新的http请求后&#xff0c;最终会调用asp.net_isapi.dll的ISAPI扩展(特指IIS6.0环境&#xff0c;iis7.0的应用程序池默认为集成方式&#xff0c;相对有所变化)&#xff0c;然后传递到httpRuntime Pipe(http运行时管道)&#xff0c;Asp.Net这时才开始运行(即HttpR…

ByteBuffer常用方法详解

缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储&#xff0c;这部分预留的内存空间就叫做缓冲区&#xff1a; 使用缓冲区有这么两个好处&#xff1a; 1、减少实际的物理读写次数 2、缓冲区在创建时就被分配内存&#xff0c;这块内存区域…

LeetCode—221. 最大正方形

221. 最大正方形 题目描述&#xff1a; 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 考察重点&#xff1a;动态规划 方法概括&#xff1a;二维矩阵中查询最大矩形 dp[i][j] Min(dp[i-1][j],dp[i][j-1]…

Egret入门学习日记 --- 第二篇

第二篇&#xff08;学习篇&#xff09; 既然选好了Egret&#xff0c;那我就要想想怎么学了。 开始第一步&#xff0c;先加个Q群先&#xff0c;这不&#xff0c;拿到了一本《Egret HTML5游戏开发指南》&#xff0c;阅至三章&#xff0c;得到印象相对较深的好处和坏处&#xff1…

辨别文件的真实类型

2019独角兽企业重金招聘Python工程师标准>>> 参考博客http://blog.csdn.net/shixing_11/article/details/5708145 每个文件类型都对应着一个编码头部 下面这些是已知的文件头部[自定义的枚举类型] package org.masque.file; /*** * Description:文件对应的文件头,资…