机试基础(一)

113 阅读7分钟

1.排序

1.1 algorithm头文件之sort函数

题目描述

使用algorithm头文件下的sort函数将n个正整数a1、a2、...、an升序排序。

输入描述

第一行一个整数n(1≤n≤10),表示正整数的个数;

第二行为空格隔开的n个正整数a1、a2、...、an(1≤ai≤100)。

输出描述

输出排序后的所有正整数,中间用空格隔开,行末不允许有多余的空格。

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

const int N = 12;
int a[N];

int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> a[i];

    sort(a, a+n);

    for(int i = 0; i < n; i++)
    {
        cout << a[i];
        if(i < n-1)
            cout << ' ';
    }
        
    return 0;
}

使用 algorithm 头文件下的 sort 函数,默认情况下为升序。使用方式为:

sort(首地址, 尾地址的下一个地址)

1.2 algorithm头文件之sort函数II

题目描述

使用algorithm头文件下的sort函数将n个正整数a1、a2、...、an降序排序。

输入描述

第一行一个整数n(1≤n≤10),表示正整数的个数;

第二行为空格隔开的n个正整数a1、a2、...、an(1≤ai≤100)。

输出描述

输出排序后的所有正整数,中间用空格隔开,行末不允许有多余的空格。

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

const int N = 15;
int a[N];

bool cmp(int a, int b)
{
    if(a > b)   return true;
    else    return false;
}

int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++)
        cin >> a[i];
    
    sort(a+1, a+1+n, cmp);
    
    for(int i = 1; i <= n; i++)
    {
            cout << a[i];
            if(i != n)  cout << ' ';
    }
    return 0;
}
//关键是sort的第三个参数cmp,cmp返回值为bool类型,描述了排序的规则

1.3 algorithm头文件之sort函数III

题目描述

使用algorithm头文件下的sort函数将n个字符串s1、s2、...、sn按字典序升序排序。

输入描述

第一行一个整数n(1≤n≤10),表示字符串的个数;

接下来n行,每行一个字符串(仅由小写字母组成,长度不超过10)。

输出描述

每行一个,输出升序后所有字符串。

//使用string类型数组的写法
#include <bits/stdc++.h>
using namespace std;

const int N = 20;
string str[N];

int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++)
        cin >> str[i];

    sort(str+1, str+1+n);    

    for(int i = 1; i <= n; i++)
        cout << str[i] << endl;;

    return 0;
}
//使用char*定义数组的写法
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAXN = 10;
char* str[MAXN];

bool cmp(char s1[], char s2[]) {
    return strcmp(s1, s2) < 0;    //strcmp函数比较字典序大小
}

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        str[i] = new char[MAXN + 1];  //分配一个字符串大小空间
        scanf("%s", str[i]);  //写入
    }
    sort(str, str + n, cmp);
    for (int i = 0; i < n; i++) {
        printf("%s\n", str[i]);
    }
    return 0;
}

1.4 algorithm头文件之sort函数IV

题目描述

写代码完成下面的步骤:

  1. 定义结构体struct Node { int x, y; }
  2. 定义一个空的vector<Node>,命名为v
  3. 使用v.push_back()方法将n个Node变量node1、node2、...、noden读入v
  4. 编写bool cmp(Node a, Node b)函数,使当a.x != b.x时返回a.x < b.x,否则返回a.y < b.y
  5. 使用algorithm头文件下的sort函数将v中的所有元素排序(使用上面定义的cmp函数作为sort函数的比较函数),即先按x升序、x相同时按y升序;
  6. 正向遍历v,将所有元素依次输出。

输入描述

第一行一个整数n(1≤n≤10),表示Node变量的个数;

接下来n行,每行两个整数x、y(1≤x≤10,1≤y≤10),表示一个Node变量的两个成员,中间用空格隔开。

输出描述

每行输出一个Node变量的成员xy,中间用空格隔开。

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

struct Node{
    int x, y;
    Node(){}
    Node(int _x, int _y)
    {
        x = _x;
        y = _y;
    }
};

bool cmp(Node a, Node b)
{
    if(a.x != b.x)
        return a.x < b.x;
    else
        return a.y < b.y;
}

vector<Node> v;

int main()
{
    int n;
    cin >> n;

    for(int i = 0; i < n; i++)
    {
        int a, b;
        cin >> a >> b;
        v.push_back(Node(a, b));
    }

    sort(v.begin(), v.end(), cmp);

    for(int i = 0; i < n; i++)
        cout << v[i].x << ' ' << v[i].y << endl;

/*
    for(auto tmp : v)
        cout << tmp.x << ' ' << tmp.y << endl;
*/
    return 0;
}
//结构体类型的排序问题

1.5 考生排序

题目描述

给定n个考生的姓名、分数,将这些考生按分数从高到低进行排序,分数相同时按姓名的字典序从小到大进行排序,输出排序后的结果。

输入描述

第一行一个整数n(1≤n≤1000),表示考生个数;

接下来n行,每行为一个考生的姓名name和分数score(name为仅由大小写字母组成的不超过15个字符的字符串,0≤score≤100),用空格隔开。数据确保不会出现相同的姓名。

输出描述

输出排序后的结果,共n行,每行为一个考生的姓名和分数,用空格隔开。

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

struct student{
    string name;
    double score;

    student(string _name, double _score)
    {
        name = _name;
        score = _score;
    }
};

vector<student> v;

bool cmp(student st1, student st2)
{
    if(st1. score != st2.score)
        return st1.score > st2.score;
    else
        return st1.name < st2.name;
}

int main()
{
    int n;
    cin >> n;

    for(int i = 0; i < n; i++)
    {
        string n;
        double s;
        cin >> n >> s;
        v.push_back(student(n, s));
    }

    sort(v.begin(), v.end(), cmp);

    for(auto tmp : v)
        cout << tmp.name << ' ' << tmp.score << endl;

    return 0;
}
//对上面模板题的简单应用

1.6 考生排序II

题目描述

给定n个考生的姓名、语文分数、数学分数,按下面两种排序要求之一进行排序:

  1. 按语文分数从高到低排序,分数相同时按姓名字典序从小到大排序
  2. 按数学分数从高到低排序,分数相同时按姓名字典序从小到大排序

输出排序后的结果。

输入描述

第一行两个整数n(1≤n≤1000)、k(1≤k≤2),分别表示考生个数、排序方式(k=1时表示按第一种方式排序,k=2时表示按第二种方式排序);

接下来n行,每行为一个考生的姓名name、语文分数score1、数学分数score2(name为仅由大小写字母组成的不超过15个字符的字符串,0≤score≤100),用空格隔开。数据确保不会出现相同的姓名。

输出描述

输出排序后的结果,共n行,每行为一个考生的姓名、语文分数、数学分数,用空格隔开。

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

struct student{
    string name;
    double score1;
    double score2;

    student(string _name, double _score1, double _score2)
    {
        name = _name;
        score1 = _score1;
        score2 = _score2;
    }
};

vector<student> v;

bool cmp1(student st1, student st2)
{
    if(st1. score1 != st2.score1)
        return st1.score1 > st2.score1;
    else
        return st1.name < st2.name;
}

bool cmp2(student st1, student st2)
{
    if(st1. score2 != st2.score2)
        return st1.score2 > st2.score2;
    else
        return st1.name < st2.name;
}

int main()
{
    int n;
    int k;
    cin >> n >> k;

    for(int i = 0; i < n; i++)
    {
        string n;
        double s1, s2;
        cin >> n >> s1 >> s2;
        v.push_back(student(n, s1, s2));
    }
    if(k == 1)
        sort(v.begin(), v.end(), cmp1);
    else    
        sort(v.begin(), v.end(), cmp2);

    for(auto tmp : v)
        cout << tmp.name << ' ' << tmp.score1  << ' ' << tmp.score2 << endl;

    return 0;
}
//很无聊,和上面差不多

1.7 计算排名

题目描述

给定n个考生的分数,将它们从高到低排序,然后输出每个分数对应的排名。

注:

  1. 排名 = 高于当前分数的考生个数 + 1
  2. 分数相同时排名相同

输入描述

第一行一个整数n(1≤n≤1000),表示分数的个数;

第二行共n个用空格隔开的整数(0≤score≤100),表示n个考生的分数。

输出描述

共n行,每行为一个分数和对应的排名,用空格隔开。

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

const int N = 1010;
int a[N];

bool cmp(int a, int b)
{
    if(a > b)
        return true;
    else    return false;
}

int main()
{
    int n;
    cin >> n;

    for(int i = 1; i <= n; i++)
        cin >> a[i];
    
    sort(a+1, a+1+n, cmp);

    int r = 1;    //r为排序序号
    for(int i = 1; i <= n; i++)
    {    
        cout << a[i] << ' ';
        if(i == 1 || a[i] != a[i-1])    //如果是第一个学生,或者这个学生的分数和上一学生分数不同 
            r = i;    //则序号等于下标
            
        cout << r << endl;    //否则维持上一个学生的序号不变
    }

    return 0;
}
//本题的特点是:对于具有相同分数的学生,其排序也相同,不能简单地输出其在排序后数组中的下   
//记住固定写法即可