杭州电子科技大学ACM入门笔记day02

136 阅读2分钟

餐前点心

int a[1000],b=5,c=8;
swap(b,c);//数据的交换
memset(a,0,sizeof(a));//初始化数组,通常为0/-1

贪心算法

对问题求解的时候,总那个是做出在当前看来是最好的选择, 也就是说,局部最优不代表是全局最优,需要证明

sort()

image.png 如果不提供比较函数,则默认按照元素的升序进行排序 less<int>()升序。 greater<int>()降序。

第三个参数comp是一个可选的比较函数,用于自定义排序规则。对于浮点数需要特别注意
大于就是从大到小(降序)
小于就是从小到大(升序) image.png

image.png

image.png

#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;
}

例题

image.png 最长的事件序列必然有一种情况是包含最早结束时间的

image.png

image.png

image.png 最高重叠层数
细节1。 10-20 20-10 循环前判断交换位置
细节2。 1和2是对门,会采用同一个走廊 使其对应下标保持一致
例题 image.png 题解: 寻找逆序对的前一个删掉,没有逆序对删掉最后一个就行

例题
7是青蛙的数量
4 3 1 5 4 2 1分别是该青蛙的邻居有多少个

image.png 引入一个概念:度就是节点被连接的边数

image.png 判断是不是可图,度序列是非增序列,每次删除都要进行排序,最后出现负数就是NO,知道原理只要会排序就行,全部为0就是yes image.png