C++是什么之XM02好像有模板?
2025-08-21 10:45:39
发布于:浙江
0. 进制转换和位运算
1. 进制转换
1) 十进制转n进制: 除n取余,逆序排列
2) n进制转十进制:
ex: 二进制转十进制
(1111)2 = (1*2^3 + 1*2^2 + 1*2^1 + 1*2^0)10 = (15)10
3) 二进制转八进制: 从右往左,每3位组成1位八进制
4) 二进制转十六进制: 从右往左,每4位组成1位十六进制
2. 原码、反码、补码(位运算)
正数: 原码 = 反码 = 补码
负数: 原码 = 正数的原码(符号位变成1)
反码 = 除符号位,其他全部取反
补码 = 反码 + 1
3. 位运算
1) 按位与
1 & 1 = 1, 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0
2) 按位或
1 | 1 = 1, 1 | 0 = 1, 0 | 1 = 1, 0 | 0 = 0
3) 按位异或
1 ^ 1 = 0, 1 ^ 0 = 1, 0 ^ 1 = 1, 0 ^ 0 = 0
4) 取反
~7 = ~(0000 0111) = 1111 1000(补) = 1111 0111(反) = 1000 1000(原) = -8
1. sort排序
//sort排序模板
#include <bits/stdc++.h>
using namespace std; //标准命名空间
//排序sort模板
int a[100005];
bool cmp(int x, int y){
return x > y;
}
int main(){
int n;
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
//头文件:algorithm
//sort升序: sort(数组名+开始下标, 数组名+结束下标+1);
sort(a+1, a+n+1);
//sort降序: sort(数组名+开始下标, 数组名+结束下标+1, cmp);
sort(a+1, a+n+1, cmp);
return 0;
}
2. 桶标记相关
//桶排序模板
#include <bits/stdc++.h>
using namespace std; //标准命名空间
//桶排序
int a[105]; //根据数据范围来定数组大小
int main(){
int n, x;
cin >> n;
for(int i = 1; i <= n; i++){ //n<=10000
cin >> x;
a[x]++;
}
for(int i = 1; i <= 100; i++){
for(int j = 1; j <= a[i]; j++){
cout << i << " ";
}
}
return 0;
}
//桶标记去重
#include <bits/stdc++.h>
using namespace std; //标准命名空间
//桶排序
int a[105]; //根据数据范围来定数组大小
int main(){
int n, x;
cin >> n;
for(int i = 1; i <= n; i++){ //n<=10000
cin >> x;
a[x]++;
}
for(int i = 1; i <= 100; i++){
if(a[i] > 0) cout << i << " ";
}
return 0;
}
3. 前缀和模板
#include <bits/stdc++.h>
using namespace std; //标准命名空间
int a[100005], s[100005];
int main(){
int n;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
s[i] = s[i-1] + a[i];
}
//1. 输出前x个数字的和
int x;
cin >> x;
cout << s[x];
//2. 输出l~r之间的和
int l, r;
cin >> l >> r;
cout << s[r] - s[l-1];
return 0;
}
4. 二分查找模板
#include <bits/stdc++.h>
using namespace std; //标准命名空间
int a[100005];
int main(){
int n;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
int x; //要寻找的数
cin >> x;
//寻找第一个大于等于x的数字的位置
//lower_bound(数组名+开始下标, 数组名+结束下标+1, 目标值) - 数组名;
cout << lower_bound(a+1, a+n+1, x) - a;
//寻找第一个大于x的数字的位置
//upper_bound(数组名+开始下标, 数组名+结束下标+1, 目标值) - 数组名;
cout << upper_bound(a+1, a+n+1, x) - a;
return 0;
}
5. 结构体排序
题目链接:结构体排序标准模板题
#include <bits/stdc++.h>
using namespace std;
struct student{
//语文、数学、英语、总分、学号
int yw, sx, yy, sum, id;
}a[305];
bool cmp(student x, student y){
//如果总分不同,根据总分从大到小
if(x.sum != y.sum) return x.sum > y.sum;
//否则(总分相同)语文不同,根据语文从大到小
else if(x.yw != y.yw) return x.yw > y.yw;
//否则根据学号从小到大
else return x.id < y.id;
}
int main(){
int n;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i].yw >> a[i].sx >> a[i].yy;
a[i].sum = a[i].yw + a[i].sx + a[i].yy;
a[i].id = i;
}
sort(a+1, a+n+1, cmp);
//输出前5个人的信息
for(int i = 1; i <= 5; i++){
cout << a[i].id << " " << a[i].sum << endl;
}
return 0;
}
6. GESP相关
GESP官网
GESP大纲
ACGO-GESP真题卷/模拟卷
全部评论 1
1周前 来自 上海
0寒假有难度,我努力
1周前 来自 浙江
0
有帮助,赞一个