ACM入门之OJ~
所谓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~的更多相关文章
- 杭电OJ:1089----1096(c++)(ACM入门第一步:所有的输入输出格式)
1089:输入输出练习的A + B(I) 问题描述 您的任务是计算a + b. 太容易了?!当然!我专门为ACM初学者设计了这个问题. 您一定已经发现某些问题与此标题具有相同的名称,是的,所有这些问题 ...
- 大牛对ACM入门菜鸟的一些话
首先就是我为什么要写这么一篇日志.原因很简单,就是因为前几天有个想起步做ACM人很诚恳的问我该如何入门.其实就现在而言,我并不是很想和人再去讨论这样的话题,特别是当我发现我有很多的东西要学的时候,我实 ...
- ACM入门指南
本文已经转移到了:http://harryguo.me/2015/11/03/ACM-%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/ 什么是ACM? 想必打开这篇博客的人已 ...
- acm入门 杭电1001题 有关溢出的考虑
最近在尝试做acm试题,刚刚是1001题就把我困住了,这是题目: Problem Description In this problem, your task is to calculate SUM( ...
- ACM入门步骤(一)
一般的入门顺序: 0. C语言的基本语法(或者直接开C++也行,当一个java选手可能会更受欢迎,并且以后工作好找,但是难度有点大),[参考书籍:刘汝佳的<算法竞赛入门经典>,C++入门可 ...
- ACM 入门计划
acm 本文由swellspirit贡献 ACM • I can accept failure. but I can't accept not trying. Life is often compar ...
- ACM入门
1.给n个数字,将它们重新排序得到一个最大的数字 例子 4123 124 56 90--------------90561241235123 124 56 90 9------------990561 ...
- acm入门编成题
http://wenku.baidu.com/view/c8f2f64acf84b9d528ea7aee.html
- ACM入门记
[2015.12]零基础进队 [2016.4.10]浙大第十六届程序设计大赛 [2016.6.4]团体程序设计天梯赛初赛 [2016.7.16]团体程序设计天梯赛决赛 赛后总结:比赛的时候好慌,一道题 ...
随机推荐
- C# 获取当前年份的周期,周期所在日期范围
最近有一个项目要用到年份周期,用于数据统计图表展示使用,当中用到年份周期,以及年份周期所在的日期范围.当初设想通过已知数据来换算年份周期,经过搜索资料发现通过数据库SQL语句来做,反而更加复杂.现在改 ...
- Spring温故而知新 – Spring AOP
AOP的相关专业术语 通知(Advice):定义在连接点做什么 Spring中通知类型:前置通知,后置通知,返回通知,异常通知,环绕通知 连接点(JoinPoint):程序执行过程中拦截的点,Spin ...
- hdu-3071 Gcd & Lcm game---质因数分解+状态压缩+线段树
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3071 题目大意: 给定一个长度为n的序列m次操作,操作的种类一共有三种 查询 L :查询一个区间的所 ...
- 易用性测试、本地化测试、部署测试、无障碍测试、回归测试、冒烟测试、A/B测试
1.易用性定义: 易用性测试是指测试用户使用软件时是否感觉方便,是否能保证用户使用的测试类型2.本地化测试: ·定义:针对软件的本地化版本实施的针对性测试 ·测试内容: (1)语言,书写习惯 (2)时 ...
- AXIS2整合spring需要的jar,以及大部分缺少jar所报的异常
axis2 webservice 服务端jar包: -->axis2-kernel-1.6.1.jar -->axis2-spri ...
- Linux 普通用户之间免密登陆
目的: 同台机器之间实现普通用户之间的免密登陆: NN01 的user1 免密登陆 user2 不同机器之间实现普通用户之间的免密登陆 :NN01 的user1 免密登陆 NN01 的user1 一. ...
- 计算机组装:台式机更换CPU
前言: 由于想在一台WindowsXP操作系统的台式机上使用虚拟机,但是这个台式机原装的CPU(Intel 奔腾 E2200)不支持虚拟化,所以我找了一颗支持虚拟化的CPU(Intel 酷睿 E850 ...
- genymotion中app打开后屏幕是倒的问题
屏幕是倒的是因为你使用了虚拟机的默认分辨率. 解决办法: 选择需要的设置的虚拟机,点击后面的设置按钮 弹窗中选择其他的分辨率 如果之前是1024x600,前面的数值大于后面的.则换成前面的数值小于后面 ...
- 系列博文-LowPoly风格的图像生成器
https://github.com/Ovilia/Polyvia http://www.zhihu.com/question/29856775/answer/57668656 http://zhan ...
- Android 框架炼成 教你如何写组件间通信框架EventBus
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41096639 ,本文出自:[张鸿洋的博客] 1.概述 关于Eventbus的介绍 ...