餐前点心
int a[1000],b=5,c=8;
swap(b,c);//数据的交换
memset(a,0,sizeof(a));//初始化数组,通常为0/-1
贪心算法
对问题求解的时候,总那个是做出在当前看来是最好的选择, 也就是说,局部最优不代表是全局最优,需要证明
sort()
如果不提供比较函数,则默认按照元素的升序进行排序
less<int>()升序。
greater<int>()降序。
第三个参数comp是一个可选的比较函数,用于自定义排序规则。对于浮点数需要特别注意
大于就是从大到小(降序)
小于就是从小到大(升序)
#include <algorithm>
#include <vector>
using namespace std;
bool compare(int a, int b) {
return a > b;
}
int main() {
vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
sort(v.begin(), v.end(), compare);
return 0;
}
例题:田忌赛马
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int a, b, c; // 田忌的马的速度
cin >> a >> b >> c;
int x, y, z; // 齐王的马的速度
cin >> x >> y >> z;
// 将田忌的马的速度从大到小排序
int horses[3] = {a, b, c};
sort(horses, horses + 3, greater<int>());
// 计算田忌和齐王获胜的比赛次数
int winCount = 0; // 田忌获胜的次数
int loseCount = 0; // 齐王获胜的次数
for (int i = 0; i < 3; ++i) {
if (horses[i] > x) {
winCount++;
} else {
loseCount++;
}
// 更新齐王最快的马的速度
if (x > y) {
x = y;
} else {
x = z;
}
}
// 输出结果
if (winCount > loseCount) {
cout << "田忌获胜" << endl;
} else if (winCount < loseCount) {
cout << "齐王获胜" << endl;
} else {
cout << "平局" << endl;
}
return 0;
}
例题
最长的事件序列必然有一种情况是包含最早结束时间的
最高重叠层数
细节1。 10-20 20-10 循环前判断交换位置
细节2。 1和2是对门,会采用同一个走廊 使其对应下标保持一致
例题
题解:
寻找逆序对的前一个删掉,没有逆序对删掉最后一个就行
例题
7是青蛙的数量
4 3 1 5 4 2 1分别是该青蛙的邻居有多少个
引入一个概念:度就是节点被连接的边数
判断是不是可图,度序列是非增序列,每次删除都要进行排序,最后出现负数就是NO,知道原理只要会排序就行,全部为0就是yes