Ryanlyt / algorithm-learning

The firse
0 stars 0 forks source link

9.16 #8

Open Ryanlyt opened 1 year ago

Ryanlyt commented 1 year ago

贪心

代码简单,证明难

区间问题

区间选点

1、将每个区间按右端点从小到大排序 2、从前往后依次枚举每个区间(如果当前区间中已经包含点,则直接pass;否则,选择当前区间的右端点) WIFI0s014844759091695004620206 WIFI0s0-5675075381695004620186

#include <bits/stdc++.h>

using namespace std;

const int N = 100010;

int n;
struct Range{
    int l, r;
    bool operator< (const Range &w) const{
        return r < w.r;
    }
}range[N];

int main(){
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        int l, r;
        scanf("%d%d",&l, &r);
        range[i] = {l ,r};
    }

    sort(range, range + n);

    int res = 0, ed = -2e9;
    for(int i = 0; i < n; i++){
        if(range[i].l > ed){
            res++;
            ed = range[i].r;
        }
    }

    printf("%d\n",res);

    return 0;
}
最大不相交区间数量

WIFI0s011214362041695004620166

#include <bits/stdc++.h>

using namespace std;

const int N = 100010;

int n;

struct Range{
    int l, r;
    bool operator< (const Range &w)const{
        return r < w.r;
    }
}range[N];

int main(){
    scanf("%d",&n);    
    for(int i = 0; i < n; i++){
        int l, r;
        scanf("%d%d",&l, &r);

        range[i] = {l ,r};
    }

    int ed = -2e9, res = 0;
    for(int i = 0; i < n; i++){
        if(range[i].l > ed){
            res++;
            ed = range[i].r;
        }
    }

    printf("%d\n",res);

    return 0;
}
区间分组

WIFI0s018133075931695004620147 WIFI0s015081066291695004620129

什么时候考虑左端点,什么时候右端点:经验、积累

动态的维护最小值:可以用小根堆(优先队列)来做

区间覆盖

WIFI0s017392227321695004620111 WIFI0s0-3127607151695004620091 WIFI0s03791106741695004620072

#include <bits/stdc++.h>

using namespace std;

const int N = 100010;

int n;
struct Range{
    int l, r;
    bool operator< (const Range &w)const{
        return l < w.l;
    }
}range[N];

int main(){
    int st, ed;
    scanf("%d%d", &st, &ed);
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        int l, r;
        scanf("%d%d", &l, &r);
        range[i] = {l ,r};
    }

    sort(range, range + n);

    int res = 0;
    bool success = false;
    for(int i = 0; i < n; i++){
        int j = i, r = -2e9;
        while(j < n && range[j].l <= st){
            r = max(r, range[j].r);
            j++;
        }

        if(r < st){
            res = -1;
            break;
        }

        res++;
        if(r >= ed){
            success = true;
            break;
        }

        st = r;
        i = j - 1;
    }

    if(!success) res = -1;
    printf("%d", res);

    return 0;
}

1、将所有区间按左端点从小到大排序 2、从前往后依次枚举每个区间,在所有能覆盖start的区间中,选择一个右端点最大的区间,并把start更新成右端点的的最大值

Ryanlyt commented 1 year ago

Huffman树

合并果子

WIFI0s0739097101695004620054 WIFI0s017628534521695004620034

WIFI0s0-18402424551695004620015

#include <bits/stdc++.h>

using namespace std;

int main(){
    int n;
    scanf("%d", &n);

    priority_queue<int, vector<int>, greater<int>> heap;    //用小根堆动态维护最小的值
    while(n--){
        int x;
        scanf("%d", &x);
        heap.push(x);
    }

    int res = 0;
    while(heap.size() > 1){
        int a = heap.top(); heap.pop();
        int b = heap.top(); heap.pop();
        res += a + b;
        heap.push(a + b);
    }

    printf("%d", res);

    return 0;
}
Ryanlyt commented 1 year ago

排序不等式

排队打水

WIFI0s02547136501695004619995 WIFI0s020148852961695004620283

Ryanlyt commented 1 year ago

绝对值不等式

货仓选址

_fa4e9c90ae8c1d76ee215b5571b8242f_-125813327_Screenshot_2023-09-17-10-33-49-599_com alicloud databox _73373524ef5fc10ed8c14d930dccb86d_-1918065890_Screenshot_2023-09-17-10-38-12-111_com alicloud databox _82caa42cd48970a888b7797e6273314b_1451920378_Screenshot_2023-09-17-10-39-59-212_com alicloud databox

Ryanlyt commented 1 year ago

推公式

耍杂技的牛

_cb7e15da83fecf7c4ae95e11f5a74979_983868788_Screenshot_2023-09-17-10-41-20-820_com alicloud databox _3ab724d57924dc5befaf64951b8ae9cc_-727682161_Screenshot_2023-09-17-10-43-34-439_com alicloud databox _c52da2869ea1d91e338baa9f3bc12831_-1472847016_Screenshot_2023-09-17-10-45-51-525_com alicloud databox _87b084127dbcd4f7709a659728d5e331_-2015662109_Screenshot_2023-09-17-10-48-35-181_com alicloud databox