• 最高的牛(差分,贪心)


    题意

    \(N\)头牛站成一行,被编队为\(1, 2, 3, \dots, N\),每头牛的身高都为整数。

    当且仅当两头牛中间的牛身高都比它们矮时,两头牛方可看到对方。

    现在,我们只知道其中最高的牛是第\(P\)头,它的身高是\(H\),剩余牛的身高未知。

    但是,我们还知道这群牛之中存在着\(M\)对关系(同一个关系可能会多次给出),每对关系都指明了某两头牛\(A\)\(B\)可以相互看见。

    求每头牛的身高的最大可能值是多少。

    题目链接:https://www.acwing.com/problem/content/103/

    数据范围

    \(1 \leq N \leq 1\)
    \(0 \leq M \leq 10000\)

    思路

    假设全部身高都是\(H\),然后每出现一对关系,就将他们之间的牛的身高全减\(1\),这个过程可以采用差分进行维护。最后求前缀和即可。

    会不会出现两个区间交叉的情况呢?答案是不会。因为交叉会产生矛盾。

    代码

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <map>
    
    using namespace std;
    
    const int N = 5010, M = 10000;
    
    int n, p, h, m;
    int b[N];
    map<int, int> mp;
    
    void insert(int l, int r)
    {
        b[l] --, b[r + 1] ++;
    }
    
    int main()
    {
        scanf("%d%d%d%d", &n, &p, &h, &m);
        for(int i = 1; i <= m; i ++) {
            int x, y;
            scanf("%d%d", &x, &y);
            if(x > y) swap(x, y);
            if(!mp.count(x * M + y)) {
                insert(x + 1, y - 1);
                mp[x * M + y] ++;
            }
        }
        for(int i = 1; i <= n; i ++) b[i] = b[i - 1] + b[i];
        for(int i = 1; i <= n; i ++) printf("%d\n", b[i] + h);
        return 0;
    }
    
  • 相关阅读:
    数组元素的查找1
    排序——选择排序
    排序——冒泡排序
    内部类——匿名内部类
    跳一跳
    数组元素换位置游戏
    六 java和Tomcat
    九 Jenkins持续集成
    八 ip和子网详解
    七 Git版本控制
  • 原文地址:https://www.cnblogs.com/miraclepbc/p/16416326.html
Copyright © 2020-2023  润新知