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
题目描述
写代码完成下面的步骤:
- 定义结构体
struct Node { int x, y; }; - 定义一个空的
vector<Node>,命名为v; - 使用
v.push_back()方法将n个Node变量node1、node2、...、noden读入v; - 编写
bool cmp(Node a, Node b)函数,使当a.x != b.x时返回a.x < b.x,否则返回a.y < b.y; - 使用
algorithm头文件下的sort函数将v中的所有元素排序(使用上面定义的cmp函数作为sort函数的比较函数),即先按x升序、x相同时按y升序; - 正向遍历
v,将所有元素依次输出。
输入描述
第一行一个整数n(1≤n≤10),表示Node变量的个数;
接下来n行,每行两个整数x、y(1≤x≤10,1≤y≤10),表示一个Node变量的两个成员,中间用空格隔开。
输出描述
每行输出一个Node变量的成员x和y,中间用空格隔开。
#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个考生的姓名、语文分数、数学分数,按下面两种排序要求之一进行排序:
- 按语文分数从高到低排序,分数相同时按姓名字典序从小到大排序
- 按数学分数从高到低排序,分数相同时按姓名字典序从小到大排序
输出排序后的结果。
输入描述
第一行两个整数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
- 分数相同时排名相同
输入描述
第一行一个整数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;
}
//本题的特点是:对于具有相同分数的学生,其排序也相同,不能简单地输出其在排序后数组中的下
//记住固定写法即可