【OJ】机试指南 第一章

2020-03-28  本文已影响0人  吴跟强

机试指南

第一章 从零开始

OJ 网站

做题结果反馈

输入输出技巧

//输入int型变量
scanf("%d",&x);
//输入double型变量
scanf("%lf",&x);//不用float直接double
//输入char类型变量
scanf("%c",&x);
//输入字符串数组
scanf("%s",s);
//输出与输入表示方式一致
printf("%s\n",s);

输入一行字符串带空格的话,使用 gets,scanf 遇到空格会自动结束

char s[105];
gets(s);
printf("%s\n",s);

读入单个字符和输出单个字符,一般在 scanf 和 gets 中间使用 getchar 用于消除回车 '\n' 的影响

int a = 10;
printf("%x\n",a);//小写十六进制输出a
printf("%X\n",a);//大写十六进制输出A
printf("%o\n",a);//八进制输出答案12
int a = 5;
printf("%02d\n",a);//2代表宽度,不足的地方用0补充
输出结果 05
printf("%04d\n",a);
输出结果 0005
double a = 3.6;
printf("%.2lf\n",a);//2表示保留两位小数
输出结果 3.60

注:有小数输出小数,没小数输出整数,前提是输入的类型浮点类型

%g

Example:

#include <stdio.h>
int main(){
    
    double a = 2;
    double b = 2.5467;
    printf("a = %g\n",a);
    printf("b = %g\n",b);
    
    return 0;
} 

Test Result:

image-20200321110921091

很多情况下的计算会超过 int,比如求 N!,N 比较大的时候 int 就存不下了,这个时候我们就要使用 long long。

注:int 取值范围:-1e9 到 1e9,long long 取值范围:-1e18 到 1e18

long long x;
scanf("%11d",&x);
printf("%lld\n",x);
printf("%d\n",'a');

注:若遇到需要 ASCII 码的题目,记住 char 字符和 int 值是可以相互转化的。

很多时候使用 c++ 的输入输出更简单,在应对输入输出量不是很大的题目的时候,我们会采用 cin 和 cout 来提高我们的解题速度。

Example:求两个数之和

#include <iostream>//输入输出函数的头文件 
using namespace std;

int main(){
   
   int a,b;
   cin >> a >> b;
   cout << a + b;
   
   return 0;
} 

注:平时练习的时候不要排斥混合编程,即 C 与 C++ 混用,然后用 C++ 提交。但是注意:printf 尽量不要和 cout 同时使用,会发生一些不可控的意外。

头文件技巧

cpp 文件中推荐一个万能头文件:

#include <bits/stdc++.h>
using namespace std;

注:要看考试的评测机型支不支持,绝大部分都是支持的,当然准备一个完整的头文件还是有必要的,作为备用。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <string>
using namespace std;

int main(){
    
    return 0;
} 

注:头文件可以多,但是不能少

数组使用技巧

数组除了可以存储数据以外,还可以用来进行标记

例题 01:

image-20200321120529994

【代码实现】

#include <bits/stdc++.h>//万能头文件 
using namespace std;

int f[105]={0};//注意:尽量将数组开在全局 
int main(){
    int n,x;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&x);
        f[x]++;
    } 
    for(int i=1;i<=100;i++){
        if(f[i]>0){
            printf("%d %d\n",i,f[i]);
        }
    }
    return 0;
} 

例题 02:

image-20200321134145614

【代码实现】

#include <bits/stdc++.h>//万能头文件 
using namespace std;

int f[105] = {0};//注意:尽量将数组开在全局 
int p[105] = {0};//p[i]表示有 i个这样的数的最大值是多少 
int main(){
    int n,x;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&x);
        f[x]++;
    } 
    for(int i=0;i<100;i++){
        p[f[i]] = i;
    } 
    for(int i=1;i<=100;i++){
        if(p[i]>0){
            printf("%d %d\n",p[i],i);
        }
    }
    return 0;
} 

例题 03:

【题目】二维数组实现存储地图

####
#.##
##@#
####

【代码实现】

#include <bits/stdc++.h>//万能头文件 
using namespace std;

char mpt[10][10];
int main(){
    for(int i=0;i<4;i++){
        scanf("%s",mpt[i]);
    }
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            printf("%c",mpt[i][j]);
        }
        printf("\n");
    }

    return 0;
} 

复杂度与是否可做

做好审时度势

算法 循环嵌套 时间复杂度 空间复杂度
冒泡排序 两个 for 循环 O(N^2​)

注:空间复杂度一般不会限制,如果遇到了再想办法优化空间。

时限 1 s 情况下的复杂度:

时间复杂度 N 取值(时限 1 s)
O(N) N 最大在 500w 左右
O(NlogN​) N 最大在 20w 左右
O(N^2​) N 最大在 2000 左右
O(N^2logN​) N 最大在 700 左右
O(N^3​) N 最大在 200 左右
O(N^4​) N 最大在 50 左右
O(2^N​) N 最大在 24 左右
O(N!)​ N 最大在 10 左右

注:如果是 2S、3S 对应的乘以 2 和 3 就可以。

C++ STL 的使用

?> C++ 的算法头文件里有很多实用的函数,我们可以直接拿来用。

#include <algorithm>

排序函数

查找函数

优先队列

C++ 的 STL (标准模板库)是一个非常重要的东西,可以极大的帮助更快速的解决题目

vector

image-20200322201845985

queue

stack

map

set

多组输入的问题

即循环输入输出结果

【题目描述】输入两个数,输出两个数的和,要求多组输入

【代码实现】

#include <bits/stdc++.h> 
using namespace std;
int main(){
    int a,b;
    while(scanf("%d%d",&a,&b)!=EOF){
        printf("%d\n",a+b);
    }
    return 0;
}

!> 不能使用 while(1) 这样死循环,!=EOF 的意思一直读取到文件末尾(Endoffile)另外,多组输入一定要注意初始化问题,数组和变量的初始化要放在 while 循环内,否则上一次的运算的结果会影响当前的结果。

#include <bits/stdc++.h> 
using namespace std;
int main(){
    int a,b;
    while(cin >> a >> b){
        cout << a + b << endl;
    }
    return 0;
}
Scanner stdin = new Scanner(System.in);
while(stdin.hasnext()){
    String s = stdin.next();
    int n = stdin.nextInt();
    double b = stdin.nextDouble();
}
while true:
    try:
        a, b = map(int, input().split())
        c = a + b
        print(c)
    except:#读到文件末尾抛出异常结束循环
        break

上一篇下一篇

猜你喜欢

热点阅读