所谓OJ,顾名思义Online Judge,一个用户提交的程序在Online Judge系统下执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等。用户程序执行的结果将被Online Judge系统捕捉并保存,然后再转交给一个裁判程序。该裁判程序或者比较用户程序的输出数据和标准输出样例的差别,或者检验用户程序的输出数据是否满足一定的逻辑条件。最后系统返回给用户一个状态:通过(Accepted,AC)、答案错误(Wrong Answer,WA)、超时(Time Limit Exceed,TLE)、超过输出限制(Output Limit Exceed,OLE)、超内存(Memory Limit Exceed,MLE)、运行时错误(Runtime Error,RE)、格式错误(Presentation Error,PE)、或是无法编译(Compile Error,CE),并返回程序使用的内存、运行时间等信息。
可能看完定义还不太熟悉OJ,推荐杭电ACM1000,我们可以通过练习来巩固我们对OJ的输入输出掌握程度。
杭电ACM官网:http://acm.hdu.edu.cn/

那么接下来是关于OJ的判定:

在开始做OJ时,会面临一个输入输出数据的问题,OJ里的输入输出数据和平时的写程序不大一样。为什 么会不一样呢,这就牵涉到评测系统怎么判断你提交的程序是正确的。实际上评测系统是把程序的标准输入输 出数据都是放在文本文件里,你提交的程序会先经过编译,然后运行,从输入文件中读取数据,然后把结果输 出到一个文本文件中,评测系统再把标准的输出文件和你提交的程序运行的结果的输出文件进行对比,从而判 断你提交的程序的正确与否。既然是这样,要判断提交的程序的正确性就依赖于系统的测试数据,这时就不可 能只是用一组测试数据来判断程序的正确性,需要有很多组测试数据,而国际程序设计竞赛标准的评测系统是 PC2,它只支持一个题目一个输入数据文件、一个输出数据文件。所以这时候就得把多组测试数据放在一个文 件里,提交的程序必须把这个文件里的多组输入数据都得出结果。

一、输入: 1、只有一组测试数据,这时候是最简单的了。 C语言代码:

#include < stdio.h >
int main()
{  int a,b;
     scanf("%d %d",&a, &b);
     printf("%d\n",a+b);
     return0;
} 

C++语言代码:

1 #include < iostream >
2 usingnamespace std;
3 int main()
4 {
5      int a,b;
6      cin >> a >> b;
7      cout << a+b << endl;
8      return0;
9 }

2、有多组测试数据,直到读至输入文件结尾为止,这时需要用到while(scanf("%d",&n)!=EOF)或while(~scanf("%d",&n))或while (cin>>n)。
C语言代码:

1 #include < stdio.h >
2 int main()
3 {
4      int a,b;
5      while(scanf("%d %d",&a, &b) != EOF)
6      printf("%d\n",a+b);
7      return0;
8  }

说明:scanf函数返回值就是读出的变量个数,如:scanf( “%d %d”, &a, &b );如果只有一个整数输入,返 回值是1,如果有两个整数输入,返回值是2,如果一个都没有,则返回值是-1。EOF是一个预定义的常量,等
于-1。

C++语言代码:

1 #include < iostream >
2  usingnamespace std;
3 int main()
4  {
5     int a,b;
6     while(cin >> a >> b)
7     cout << a+b << endl;
8     return0;
9  } 

3、在开始的时候输入一个N,接下来是N组数据。 C语言代码:

 1 #include<stdio.h>
 2 int main()
 3  {
 4   int n,i;
 5     int a,b;
 6    scanf("%d",&n);
 7     for(i=0;i<n;i++)
 8  {
 9         scanf("%d%d",&a,&b);
10         printf("%d\n",a+b);
11  }
12         return0;
13  }  

或者

 1 #include<stdio.h>
 2 int main()
 3  {
 4     int n, i;
 5     int a, b;
 6     scanf("%d", &n);
 7     while (n--)
 8    {
 9       scanf("%d%d", &a, &b);
10       printf("%d\n", a + b);
11    }
12        return0;
13  }

C++代码:

 1 #include <iostream> usingnamespace std;
 2 int main()
 3 {
 4     int a, b, n;
 5     cin >> n;
 6     while (n--)
 7     {
 8         cout << a + b << endl;
 9      }
10      return0;
11 }

4、 输入不说明有多少组数据,但以某个特殊输入为结束标志。如以0 0 代表输入结束。 C语言代码:

#include <stdio.h>
int main()
{
     int a,b;
     while(scanf("%d %d",&a, &b) &&(a||b))
     printf("%d\n",a+b);
}  

C++语言代码:

 1 #include<iostream>
 2 usingnamespace std;
 3 int main()
 4 {
 5      int a ,b;
 6      while(cin>>a>>b&&(a||b))
 7     {
 8          cout<<a+b<<endl;
 9      }
10     return0;
11  }     

5、还有一种是前几种的组合。 C语言代码:

 1 #include<stdio.h>
 2 int main()
 3 {
 4 int n,sum,a;
 5      while(scanf("%d",&n) && n)
 6      {
 7      sum=0;
 8     while(n--)
 9     {
10     scanf("%d",&a);
11     sum+=a;
12      }
13  printf("%d\n",sum);
14     return 0;
15  }

C++语言代码:

 1 #include<iostream>
 2 usingnamespace std;
 3 int main()
 4  {
 5 int n,sum,a;
 6      while(cin>>n&&n)
 7     {
 8         sum=0;
 9         while(n--)
10     {
11     cin>>a;
12      sum+=a;
13      }
14       cout<<sum<<endl;
15      }
16  return0;
17  }    

输入是一整行的字符串的,C语法: 
  char buf[20]; 
  gets(buf); 
如果用string buf;来保存: 
getline( cin , buf ); 
如果用char buf[ 255 ]; 来保存: 
cin.getline( buf, 255 ); 
scanf(“ %s%s”,str1,str2),在多个字符串之间用一个或多个空格分隔; 
若使用gets函数,应为gets(str1); gets(str2); 字符串之间用回车符作分隔。
通常情况下,接受短字符用scanf函数,接受长字符用gets函数。 
而getchar函数每次只接受一个字符,经常c=getchar()这样来使用。
getline 是一个函数,它可以接受用户的输入的字符,直到已达指定个数,或者用户输入了特定的字符。它 
的函数声明形式(函数原型)如下: 
istream& getline(char line[], int size, char endchar = '\n'); 
不用管它的返回类型,来关心它的三个参数
char line[]: 就是一个字符数组,用户输入的内容将存入在该数组内。
int size : 最多接受几个字符?用户超过size的输入都将不被接受。
char endchar :当用户输入endchar指定的字符时,自动结束。默认是回车符。 
结合后两个参数,getline可以方便地实现:用户最多输入指定个数的字符,如果超过,则仅指定个数的前面 字符有效,如果没有超过,则用户可以通过回车来结束输入。 
char name[4];cin.getline(name,4,'\n'); 
由于 endchar 默认已经是 '\n',所以后面那行也可以写成: 
cin.getline(name,4); 
最后需要说明的是,C++的输入输出流用起来比较方便,但速度比C要慢得多。在输入输出量巨大时,用 C++很可能超时,应采用C的输入输出。

二、输出: 
输出有不同的格式要求,不注意的话经常会出现“Presentation Error”,而且PC2很多时候还判断不出来输 出格式错误,就简单的判为"Wrong Answer",所以输出格式一定要注意。

C语言代码:

1 #include < stdio.h >
2 int main()
3   //把main函数定义成int类型
4 {
5     int a,b;
6     while(scanf("%d %d",&a, &b) != EOF)
7     printf("%d\n",a+b);
8     return0;
9 }

每输出一组结果换行就可以了。 
2、一组接着一组,每一组后面有一空行。

C语言代码:

1 #include<stdio.h>
2 int main()
3 {
4     int a, b;
5     while (scanf("%d%d", &a, &b) != EOF)
6     printf("%d\n\n", a + b);
7     return0;
8 }

每输出一组结果后输出两个换行就可以了。

3、一组接着一组,每两组之间有一个空行,注意与前一种区分开。

 1 #include<stdio.h>
 2 int main()
 3 {
 4      int n,m,sum,a;
 5      int i;
 6      scanf("%d",&n);
 7      for (i =0; i < n;i++)
 8       {
 9          scanf("%d",&m);
10          sum =0;
11      while (m--)
12     {
13          scanf("%d",&a);
14          sum +=a;
15      }
16      printf("%d\n",sum);
17      if (i != n-1)
18          printf("\n");
19    }
20      return0;
21  }     

判断是否到达最后一组测试数据了,如果不是最后一组测试数据就多输出一个换行

ACM入门之OJ~的更多相关文章

  1. 杭电OJ:1089----1096(c++)(ACM入门第一步:所有的输入输出格式)

    1089:输入输出练习的A + B(I) 问题描述 您的任务是计算a + b. 太容易了?!当然!我专门为ACM初学者设计了这个问题. 您一定已经发现某些问题与此标题具有相同的名称,是的,所有这些问题 ...

  2. 大牛对ACM入门菜鸟的一些话

    首先就是我为什么要写这么一篇日志.原因很简单,就是因为前几天有个想起步做ACM人很诚恳的问我该如何入门.其实就现在而言,我并不是很想和人再去讨论这样的话题,特别是当我发现我有很多的东西要学的时候,我实 ...

  3. ACM入门指南

    本文已经转移到了:http://harryguo.me/2015/11/03/ACM-%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/ 什么是ACM? 想必打开这篇博客的人已 ...

  4. acm入门 杭电1001题 有关溢出的考虑

    最近在尝试做acm试题,刚刚是1001题就把我困住了,这是题目: Problem Description In this problem, your task is to calculate SUM( ...

  5. ACM入门步骤(一)

    一般的入门顺序: 0. C语言的基本语法(或者直接开C++也行,当一个java选手可能会更受欢迎,并且以后工作好找,但是难度有点大),[参考书籍:刘汝佳的<算法竞赛入门经典>,C++入门可 ...

  6. ACM 入门计划

    acm 本文由swellspirit贡献 ACM • I can accept failure. but I can't accept not trying. Life is often compar ...

  7. ACM入门

    1.给n个数字,将它们重新排序得到一个最大的数字 例子 4123 124 56 90--------------90561241235123 124 56 90 9------------990561 ...

  8. acm入门编成题

    http://wenku.baidu.com/view/c8f2f64acf84b9d528ea7aee.html

  9. ACM入门记

    [2015.12]零基础进队 [2016.4.10]浙大第十六届程序设计大赛 [2016.6.4]团体程序设计天梯赛初赛 [2016.7.16]团体程序设计天梯赛决赛 赛后总结:比赛的时候好慌,一道题 ...

随机推荐

  1. SSM博客

    最近在写基于SSM 的博客,用的是spring+springmvc+mybatis搭建的,用的maven+github管理项目,目前完成了登录注册以及用户管理员的增删改查,后续的功能还需要完善,如何建 ...

  2. JavaScript(三、DOM文档对象模型)

    一.什么是DOM DOM 是 Document Object Model(文档对象模型)的缩写. DOM 是 W3C(万维网联盟)的标准. DOM 定义了访问 HTML 和 XML 文档的标准: &q ...

  3. PAT1055:The World's Richest

    1055. The World's Richest (25) 时间限制 400 ms 内存限制 128000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  4. MQ、JMS 关系的理解

    MQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们.消息传 ...

  5. Java公开课-03.内部类

    一.内部类的作用 1.实现了类的隐藏 2.实现了多重继承 3.内部类拥有外部类所拥有的属性和方法的访问权限 4.避免修改接口的时候出现同名方法 二.内部类--成员内部类 1.如果我们想访问内部类,我们 ...

  6. Sublime Text 3 Build 3065 License key 注册码 秘钥

    -– BEGIN LICENSE -– Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 6C0EEB94 BC99798F ...

  7. [Python] uniform() 函数

    描述uniform() 方法将随机生成下一个实数,它在[x, y) 范围内. 语法以下是 uniform() 方法的语法: import random random.uniform(x, y) 注意: ...

  8. Python爬虫利器五之Selenium的用法

    1.简介 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的 ...

  9. Win7 系统记事本乱码及cmd闪退解决办法

    打开控制面板,点击时钟.语言和区域               中文(简体)改为英语(英国),然后重启电脑,重启电脑之后,继续此操作,在把英语(英国)改为中文(简体),再次重启电脑,就OK了.

  10. json & pickle 序列化

    #!/usr/bin/python # -*- coding: utf-8 -*- # 序列化: 例如把字典写进文件 info = { 'name': 'alex', 'age': 22 } f = ...