ACM 程序设计竞赛入门:第1讲 快速入门
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/showproblem.php ?pid=1095
2020/12/10
29
Problem Description
Your task is to Calculate a + b.
Input
The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line.
For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.
Sample input:
也可以写成: cin.getline(name,4);
2020/12/10
26
输出(1):
一个Input Block对应一个Output Block, Output Block之间没有空行。 参见:HDOJ_1089
/showproblem.php ?pid=1089
}
while(scanf(……..)&&……) { ....
}
C++语法:
while( cin >> n && n != 0 ) {
.... }
2020/12/10
18
输入(4):
以上几种情况的组合
/showproblem.php ?pid=1092
/showproblem.php ?pid=1093
不用管它的返回类型,来关心它的三个参数:
char line[]: 就是一个字符数组,用户输入的内容将存入在该 数组内。
int size : 最多接受几个字符?用户超过size的输入都将不被接 受。
char endchar :当用户输入endchar指定的字符时,自动结束。 默认是回车符。
2020/12/10
int )
{
int a,b;
while(scanf("%d %d",&a, &b))
{ if(a==0&&b==0)break;
else printf("%d\n",a+b);
}
2020/12/10
17
本类输入解决方案:
C语法:
while(scanf(……..))
{ if (…..) break; ....
for(j=0;j<n;j++)
{
scanf("%d",&a); sum+=a;
}
if(i<total-1)
printf("%d\n",sum);
else
printf("%d",sum);
}
}
2020/12/10
21
输入(5):
输入是一整行的字符串的 参见:HDOJ_1048
/showproblem.php ?pid=1048
2020/12/10
5
输入(1):
输入不说明有多少个Input Block,以EOF 为结束标志。 参见:HDOJ_1089
/showproblem.php ?pid=1089
2020/12/10
6
The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line.
acm比赛看重的是算法,语言相关性相对较小。
2020/12/10
2
第一部分
基本输入输出
2020/12/10
3
关于 ACM题目的输入输出
ACM竞赛题目的输入数据和输出数据一般 有多组(不定),并且格式多种多样,有 效处理题目的输入输出,是完成ACM竞赛 题目的一项基本要求。这也是困扰初学者 的一大问题。
15
10 20
Sample output: 6 30
2020/12/10
7
Hdoj_1089源代码:
#include <stdio.h> int main() {
int a,b;
while(scanf("%d %d",&a, &b) != EOF) printf("%d\n",a+b);
}
2020/12/10
25
说明(5_2)续
结合后两个参数,getline可以方便地实 现: 用户最多输入指定个数的字符,如 果超过,则仅指定个数的前面字符有效 ,如果没有超过,则用户可以通过回车 来结束输入。
char name[4]; cin.getline(name,4,'\n'); 由于 endchar 默认已经是 '\n',所以后面那行
00 Sample Output: 6
2020/12/10
16
#include <stdio.h>
int main()
{
int a,b;
while(scanf("%d %d",&a, &b)&& (a!=0||b!=0))
printf("%d\n",a+b);
}
#include <stdio.h>
/ShowProblem.as px?ShowID=1000
2020/12/10
15
Description: Calculate a + b
Input: The input will consist of a series of pairs of integers a and b,separated by a space, one pair of integers per line, 0 0 means the end of the input, and do not need to output. Output: For each pair of input integers a and b you should output the sum of a and b in one line,and with one line of output for each line in input. Sample Input: 15
2020/12/10
24
说明(5_2):cin.getline的用法:
getline 是一个函数,它可以接受用户的输入的字符,直到已达 指定个数,或者用户输入了特定的字符。它的函数声明形式( 函数原型)如下:
istream& getline(char line[], int size, char endchar = '\n');
Output
For each pair of input integers a and b you should
output the sum of a and b, and followed by a blank
line.
Sample Input
Sample Output
15
6
10 20 30
2020/12/10
2020/12/10
4
困惑:用C/C++的输入/输出?
一般来说,差别不是太大,习惯就好; cin,cout 使用方便;scanf, printf 控制灵 活,在效率上有优势; 不要混用。 千万不要把cout和printf混用,因为cout 是带缓冲的而printf不带,所以会使得输 出的数据顺序混乱。
2020/12/10
27
解决方案:
C语法: {
.... printf("%d\n",ans); }
C++语法: {
... cout << ans << endl; }
2020/12/10
28
输出(2):
一个Input Block对应一个Output Block, 每个Output Block之后都有空行。 参见:HDOJ_1095
Sample Input 2 41234 512345 Sample Output
10 15
2020/12/10
20
#include <stdio.h>
int main()
{
int total,n,i,j,a,sum;
scanf("%d",&total);
for(i=0;i<total;i++)
{ sum=0; scanf("%d",&n);
/showproblem.php ?pid=1094
2020/12/10
19
Input contains an integer N in the first line, and then N lines follow. Each line starts with a integer M, and then M integers follow in the same line.
8
本类输入解决方案:
C语法:
while(scanf("%d %d",&a, &b) != EOF)
{ ....
}
C++语法:
while( cin >> a >> b ) {
.... }
2020/12/10
9
说明:
1. Scanf函数返回值就是读出的变量个数, 如:scanf( “%d %d”, &a, &b ); 如果只有一个整数输入,返回值是1, 如果有两个整数输入,返回值是2,如 果一个都没有,则返回值是-1。
23
说明(5_1):
scanf(“ %s%s”,str1,str2),在多个字符串 之间用一个或多个空格分隔;
若使用gets函数,应为gets(str1); gets(str2); 字符串之间用回车符作分隔。 通常情况下,接受短字符用scanf函数, 接受长字符用gets函数。 而getchar函数每次只接受一个字符,经 常c=getchar()这样来使用。
11
Sample Input 2 15 10 20
Sample Output 6 30
2020/12/10
12
Hdoj_1090源代码:
#include <stdio.h> int main() {
int n,i,a,b;
scanf("%d",&n);
for(i=0;i<n;i++) {
scanf("%d %d",&a, &b); printf("%d\n",a+b); } }
2. EOF是一个预定义的常量,等于-1。
2020/12/10
10
输入(2):
输入一开始就会说有N个Input Block,下 面接着是N个Input Block。 参见:HDOJ_1090
/showproblem.php ?pid=1090
2020/12/10
30
1095源代码
#include <stdio.h> int main() {
int a,b; while(scanf("%d %d",&a, &b) != EOF) printf("%d\n\n",a+b); }
2020/12/10
31
解决办法:
C语法: {
.... printf("%d\n\n",ans); }
2020/12/10
13
本类输入解决方案:
C语法:
scanf("%d",&n) ;
for( i=0 ; i<n ; i++ ) {
.... }
C++语法:
cin >> n;
for( i=0 ; i<n ; i++ )
{
....
}
2020/12/10
14
输入(3):
输入不说明有多少个Input Block,但以某 个特殊输入为结束标志。 参见:本校OJ1000
第一讲 快速入门
2020/12/10
1
ACM题目特点:
严格的输入、输出格式;有偏差则不能AC;
追求高效简洁的算法 。即便算法是正确的, 但策略过于复杂,会导致超时;
测试数据庞大;即便算法是正确的,如果在程 序实现时出现误差都会被严密的测试数据查出 而把程序判定为错误的;
强调解决实际问题的能力。赛题与实际应用的 联系很紧密,很多试题被出题者描述成一个有 趣的故事。因此,读题能力、分析能力相当重 要。
2020/12/10
22
本类输入解决方案:
C语法: char buf[20]; gets(buf);
C++语法: 如果用string buf;来保存:
getline( cin , buf ); 如果用char buf[ 255 ]; 来保存:
cin.getline( buf, 255 );
2020/12/10
2020/12/10
29
Problem Description
Your task is to Calculate a + b.
Input
The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line.
For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.
Sample input:
也可以写成: cin.getline(name,4);
2020/12/10
26
输出(1):
一个Input Block对应一个Output Block, Output Block之间没有空行。 参见:HDOJ_1089
/showproblem.php ?pid=1089
}
while(scanf(……..)&&……) { ....
}
C++语法:
while( cin >> n && n != 0 ) {
.... }
2020/12/10
18
输入(4):
以上几种情况的组合
/showproblem.php ?pid=1092
/showproblem.php ?pid=1093
不用管它的返回类型,来关心它的三个参数:
char line[]: 就是一个字符数组,用户输入的内容将存入在该 数组内。
int size : 最多接受几个字符?用户超过size的输入都将不被接 受。
char endchar :当用户输入endchar指定的字符时,自动结束。 默认是回车符。
2020/12/10
int )
{
int a,b;
while(scanf("%d %d",&a, &b))
{ if(a==0&&b==0)break;
else printf("%d\n",a+b);
}
2020/12/10
17
本类输入解决方案:
C语法:
while(scanf(……..))
{ if (…..) break; ....
for(j=0;j<n;j++)
{
scanf("%d",&a); sum+=a;
}
if(i<total-1)
printf("%d\n",sum);
else
printf("%d",sum);
}
}
2020/12/10
21
输入(5):
输入是一整行的字符串的 参见:HDOJ_1048
/showproblem.php ?pid=1048
2020/12/10
5
输入(1):
输入不说明有多少个Input Block,以EOF 为结束标志。 参见:HDOJ_1089
/showproblem.php ?pid=1089
2020/12/10
6
The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line.
acm比赛看重的是算法,语言相关性相对较小。
2020/12/10
2
第一部分
基本输入输出
2020/12/10
3
关于 ACM题目的输入输出
ACM竞赛题目的输入数据和输出数据一般 有多组(不定),并且格式多种多样,有 效处理题目的输入输出,是完成ACM竞赛 题目的一项基本要求。这也是困扰初学者 的一大问题。
15
10 20
Sample output: 6 30
2020/12/10
7
Hdoj_1089源代码:
#include <stdio.h> int main() {
int a,b;
while(scanf("%d %d",&a, &b) != EOF) printf("%d\n",a+b);
}
2020/12/10
25
说明(5_2)续
结合后两个参数,getline可以方便地实 现: 用户最多输入指定个数的字符,如 果超过,则仅指定个数的前面字符有效 ,如果没有超过,则用户可以通过回车 来结束输入。
char name[4]; cin.getline(name,4,'\n'); 由于 endchar 默认已经是 '\n',所以后面那行
00 Sample Output: 6
2020/12/10
16
#include <stdio.h>
int main()
{
int a,b;
while(scanf("%d %d",&a, &b)&& (a!=0||b!=0))
printf("%d\n",a+b);
}
#include <stdio.h>
/ShowProblem.as px?ShowID=1000
2020/12/10
15
Description: Calculate a + b
Input: The input will consist of a series of pairs of integers a and b,separated by a space, one pair of integers per line, 0 0 means the end of the input, and do not need to output. Output: For each pair of input integers a and b you should output the sum of a and b in one line,and with one line of output for each line in input. Sample Input: 15
2020/12/10
24
说明(5_2):cin.getline的用法:
getline 是一个函数,它可以接受用户的输入的字符,直到已达 指定个数,或者用户输入了特定的字符。它的函数声明形式( 函数原型)如下:
istream& getline(char line[], int size, char endchar = '\n');
Output
For each pair of input integers a and b you should
output the sum of a and b, and followed by a blank
line.
Sample Input
Sample Output
15
6
10 20 30
2020/12/10
2020/12/10
4
困惑:用C/C++的输入/输出?
一般来说,差别不是太大,习惯就好; cin,cout 使用方便;scanf, printf 控制灵 活,在效率上有优势; 不要混用。 千万不要把cout和printf混用,因为cout 是带缓冲的而printf不带,所以会使得输 出的数据顺序混乱。
2020/12/10
27
解决方案:
C语法: {
.... printf("%d\n",ans); }
C++语法: {
... cout << ans << endl; }
2020/12/10
28
输出(2):
一个Input Block对应一个Output Block, 每个Output Block之后都有空行。 参见:HDOJ_1095
Sample Input 2 41234 512345 Sample Output
10 15
2020/12/10
20
#include <stdio.h>
int main()
{
int total,n,i,j,a,sum;
scanf("%d",&total);
for(i=0;i<total;i++)
{ sum=0; scanf("%d",&n);
/showproblem.php ?pid=1094
2020/12/10
19
Input contains an integer N in the first line, and then N lines follow. Each line starts with a integer M, and then M integers follow in the same line.
8
本类输入解决方案:
C语法:
while(scanf("%d %d",&a, &b) != EOF)
{ ....
}
C++语法:
while( cin >> a >> b ) {
.... }
2020/12/10
9
说明:
1. Scanf函数返回值就是读出的变量个数, 如:scanf( “%d %d”, &a, &b ); 如果只有一个整数输入,返回值是1, 如果有两个整数输入,返回值是2,如 果一个都没有,则返回值是-1。
23
说明(5_1):
scanf(“ %s%s”,str1,str2),在多个字符串 之间用一个或多个空格分隔;
若使用gets函数,应为gets(str1); gets(str2); 字符串之间用回车符作分隔。 通常情况下,接受短字符用scanf函数, 接受长字符用gets函数。 而getchar函数每次只接受一个字符,经 常c=getchar()这样来使用。
11
Sample Input 2 15 10 20
Sample Output 6 30
2020/12/10
12
Hdoj_1090源代码:
#include <stdio.h> int main() {
int n,i,a,b;
scanf("%d",&n);
for(i=0;i<n;i++) {
scanf("%d %d",&a, &b); printf("%d\n",a+b); } }
2. EOF是一个预定义的常量,等于-1。
2020/12/10
10
输入(2):
输入一开始就会说有N个Input Block,下 面接着是N个Input Block。 参见:HDOJ_1090
/showproblem.php ?pid=1090
2020/12/10
30
1095源代码
#include <stdio.h> int main() {
int a,b; while(scanf("%d %d",&a, &b) != EOF) printf("%d\n\n",a+b); }
2020/12/10
31
解决办法:
C语法: {
.... printf("%d\n\n",ans); }
2020/12/10
13
本类输入解决方案:
C语法:
scanf("%d",&n) ;
for( i=0 ; i<n ; i++ ) {
.... }
C++语法:
cin >> n;
for( i=0 ; i<n ; i++ )
{
....
}
2020/12/10
14
输入(3):
输入不说明有多少个Input Block,但以某 个特殊输入为结束标志。 参见:本校OJ1000
第一讲 快速入门
2020/12/10
1
ACM题目特点:
严格的输入、输出格式;有偏差则不能AC;
追求高效简洁的算法 。即便算法是正确的, 但策略过于复杂,会导致超时;
测试数据庞大;即便算法是正确的,如果在程 序实现时出现误差都会被严密的测试数据查出 而把程序判定为错误的;
强调解决实际问题的能力。赛题与实际应用的 联系很紧密,很多试题被出题者描述成一个有 趣的故事。因此,读题能力、分析能力相当重 要。
2020/12/10
22
本类输入解决方案:
C语法: char buf[20]; gets(buf);
C++语法: 如果用string buf;来保存:
getline( cin , buf ); 如果用char buf[ 255 ]; 来保存:
cin.getline( buf, 255 );
2020/12/10