挑战程序设计竞赛(第二章:2.4 数据结构)

文章目录

Expedition

参考博文:挑战程序设计竞赛:Expeition

  • 思路:需要在能够达到的加油站中选取存油最多的加油站加油,所有使用优先队列保存可以达到的加油站,然后取油量最大的加油,然后扩展车辆行驶距离,再在范围内选择油量最大的加油站。如果优先队列为空时,车还没有到达目的地,则表明车辆无法到达目的地。
  • 记忆:对于自定义的sort比较大小函数,>表示降序;对于自定义的优先队列比较大小函数,>表示取最小。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;

const int MAX = 10001;
int N, L, P, sd, sf;

struct Node
{
    int dis, fuel;
    /*
    bool operator < (const Node& B) const
    {
        return dis > B.dis;
    }*/
};

bool cmp1(Node a, Node b)
{
   return a.dis > b.dis;//降序排列
}

struct cmp2
{
    bool operator()(Node &a, Node &b)
    {
        return a.fuel < b.fuel;//取最大
    }
};
Node S[MAX];
priority_queue<Node, vector<Node>, cmp2>q;

int main()
{
    while(scanf("%d", &N)!=EOF)
    {
        for(int i=0; i<N; i++)
        {
            scanf("%d%d", &S[i].dis, &S[i].fuel);
        }
        scanf("%d%d", &sd, &sf);
        sort(S, S+N, cmp1);

        //end是车能够到达距离目的地最近的距离,cnt是最大可以行进的距离,k标记下一个遍历的加油站编号,ans是停止次数
        int end = sd-sf, cnt = sf, k = 0, ans = 0, i;

        while(1)
        {
            //如果能够到达目的地
            if(cnt >= sd) break;
            for(i=k; i<N; i++)
            {
                //将能够到达的加油站全部入队列
                if(S[i].dis>=end)
                    q.push(S[i]);
                else
                {
                    k = i;
                    break;
                }
            }
            //如果没有加油站可以加油且还没有到达目的地
            if(q.empty()) break;

            //选取可以到达的加油站中油量最多的一个
            cnt += q.top().fuel;
            end = end-q.top().fuel;
            q.pop();
            ans++;
        }
        //cout << cnt << endl;
        if(cnt>=sd) printf("%d\n", ans);
        else        printf("-1\n");
    }
    return 0;
}
食物链

参考博文:poj-1182 食物链

  • 思路:大坑题,测试数据只有一组,不能循环输入。不是简单的并查集(至于要判断是否是在同一个集合中),还需要判断多种关系,判断是否前后矛盾。
    因此,思想是使用并查集来表示在同一个集合中是可以同时存在的关系,并且不指定该动物是属于那一个类型,同时维护三种类型。有三个类型,因此扩容数组为3*N,其中1-N代表A类型,N+1-2xN代表B类型,2xN+1-3xN代表C类型。一个集合中可能存在1,2+N,表示当编号为1的动物类型为A时,编号为2的动物类型为B。
  • 思考:算法采用扩充数组的方法实际上是因为无法确定任何一个动物是属于哪一种类型,所有需要保存它所有可能的状态,防止出现冲突。比如输入 2 1 4表示1号吃4号,如果确定1号为A类型,4号为B类型,那么在输入 2 3 5将无法确定3和5的类型,因为不知道其与1和4的关系,所有最简便的方法就是保存所有可能的类型来维护其之间的关系,然后更新时同时更新三个数组部分。

代码:

#include <iostream>
#include <cstdio>
using namespace std;

const int MAX = 1e6+5;
int N, K, D, X, Y;
int pre[MAX];
int Rank[MAX];
/*
    在同一个并查集中的表示类型关系同时存在,0-N代表A类型,N-2*N代表B类型,
    2*N-3*N代表C类型
*/
void Init(int n)
{
    for(int i=0; i<=n; i++)
    {
        pre[i] = i;
        Rank[i] = 0;
    }
}
int findRoot(int x)
{
    int r = x;
    //寻找根节点
    while(pre[r]!=r)
    {
        r = pre[r];
    }
    //路径压缩
    int j=x, i;
    while(pre[j]!=r)
    {
        i = j;
        pre[j] = r;
        j = pre[i];
    }
    return r;
}
void join(int x, int y)
{
    int fx = findRoot(x), fy = findRoot(y);
    if(fx==fy) return;
    if(Rank[fx]<Rank[y])
    {
        pre[fx] = fy;
    }
    else
    {
        pre[fy] = fx;
        if(Rank[fx]==Rank[fy]) Rank[fx]++;
    }
}
bool same(int x, int y)
{
    return findRoot(x) == findRoot(y);
}

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

    int cnt = 0;
    Init(3*N);//初始化:准备3*N个节点表示n个元素
    for(int i=0; i<K; i++)
    {
        scanf("%d%d%d", &D, &X, &Y);
        if(X>N || Y>N || X<=0 || Y<=0)//判断b和c是否在范围里面
        {
            cnt++;
            continue;
        }
        if(D==1)//x和y属于同一类的信息
        {
            if(same(X, Y+2*N) || same(X, Y+N))//判断b和c在之前的情况中,是否已构成捕食与被捕食的关系
                cnt++;
            else//如果没有捕食关系,则在3个区间中把b和c放在一起
            {
                join(X, Y);
                join(X+N, Y+N);
                join(X+2*N, Y+2*N);
            }
        }
        else//x吃y的信息
        {
            if(same(X, Y) || same(X, Y+2*N))//判断b和c是否为同一类或者已经构成c吃b的捕食关系,若是则为错ans+1
                cnt++;
            else
            {
                join(X, Y+N);
                join(X+N, Y+2*N);
                join(X+2*N, Y);
            }
        }
    }
    printf("%d\n", cnt);
    return 0;
}
以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值