天梯赛刷题小记 —— L2

最近在重刷 天梯赛,浅浅记录一下,进入L2阶段了


L2-001 紧急救援

解题思路:典型的dijkstra模板题,带路径记录与权重,方案数记录,解析出过     Dijkstra(兼路径)

#include <bits/stdc++.h>
#define inf 0x3f3f3f
using namespace std;
const int N = 510;
int n, m, s, d;
int mp[N][N];
int dis[N], path[N], num[N], cot[N], sum[N];
bool st[N];
//先找到最短路径,再用相等条件下的最优解,记录最优解路径
//输出最短路径数量,输出最优解能召集到的最多数量的救援队,输出最优解路径

void dijkstra(){
    memset(dis, inf, sizeof(dis));
    memset(cot, 0, sizeof(cot));
    memset(st, false, sizeof(st));
    memset(sum, 0, sizeof(sum));
    sum[s] = num[s];
    cot[s] = 1;
    dis[s] = 0;
    for(int i =0; i<n; i++){
        int t = -1;
        for(int j=0; j<n; j++)
            if(!st[j] && ( t == -1 || dis[t] > dis[j])) t = j;
         st[t] = true;
        //cout<<t<<endl;
         for(int j = 0; j<n; j++){
             if(dis[j] > dis[t] + mp[t][j]){
                 path[j] = t;
                 dis[j] = dis[t] + mp[t][j];
                 cot[j] = cot[t];
                 sum[j] = sum[t] + num[j];
             }else if(dis[j] == dis[t] + mp[t][j]){
                 cot[j] += cot[t];
                 if(sum[j] < sum[t]+num[j]){
                     sum[j] = sum[t]+num[j];
                     path[j] = t;
                 }
             }
         }
    }
}
void printPath(int x, int y){
     if(y == x) cout<<x;
     else {
         printPath(x, path[y]);
         cout<<' '<<y;
     }
}
int main()
{
    cin>>n>>m>>s>>d;
    memset(mp, inf, sizeof(mp));
    memset(num, 0, sizeof(num));
    int x, y,z; 
    for(int i = 0; i< n; i++) cin>>num[i];
    while(m--){
        cin>>x>>y>>z;
        mp[y][x] = mp[x][y] = min(mp[x][y], z);
    }
    dijkstra();
    cout<<cot[d]<<' '<<sum[d]<<endl;
    printPath(s, d);
    return 0;
}

L2-002 链表去重

解题思路:指针,先读入,再两个分别用两个指针指向两个序列,记录序列头,重复情况用st记录键值最大也就1e4

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
bool st[N];
int  e[N], ne[N];
int main()
{
    int fpos, anspos1=-1, anspos2 = -1, spos = -1, tpos = -1,n;
    cin>>fpos>>n;
    int a, b, c;
    for(int i = 0; i<n ;i++){
        cin>>a>>b>>c;
        e[a] = b; ne[a] = c;
    }
    memset(st, false, sizeof(st));
    while(fpos != -1){
        if(st[abs(e[fpos])] == false ) {
            if(anspos1 == -1) anspos1 = fpos, anspos2= fpos;
            else ne[anspos2] = fpos, anspos2 = fpos; 
           st[abs(e[fpos])] = true;
        }else{
            if(spos == -1) spos = fpos, tpos = fpos;
            else ne[tpos] = fpos , tpos = fpos;
        }
        fpos = ne[fpos];
    }
    ne[tpos] = -1;
    ne[anspos2] = -1;
    while(anspos1 != -1){
        printf("%05d %d ", anspos1, e[anspos1]);
        if(ne[anspos1] != -1) printf("%05d\n", ne[anspos1]);
        else cout<<-1<<endl;
        anspos1 = ne[anspos1];
    }
    while(spos != -1){
        printf("%05d %d ", spos, e[spos]);
        if(ne[spos] != -1) printf("%05d\n", ne[spos]);
        else cout<<-1<<endl;
        spos = ne[spos];
    }
    return 0;
}

L2-003 月饼

解题思路:自定义排序,测试点2是 库存或者价格可能为小数

L2-004 这是二叉搜索树吗?

解题思路:树的遍历与遍历序列切割,经典,找符合条件的左右孩子,重塑树,同时考虑单调的特殊情况。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e3+10;

vector<int > ans, ans2, p(1010);
void build1(int l, int r){
    if(l > r) return ; 
    int x = l+1, y = r;
    while(x <= r && p[x] < p[l]) x++;
    while(y > l && p[y] >= p[l]) y--;
    if(x - y != 1 ) return ;
    build1(l+1, y);
    build1(x, r);
     ans2.push_back(p[l]);
}
void build2(int l, int r){//镜像
    if(l > r) return ;
    int x = l+1, y = r;
    while(x <= r && p[x] >= p[l]) x++;
    while(y > l && p[y] < p[l]) y--;
    
    if(x - y  != 1 ) return ;
    build2(l+1, y);
    build2(x, r);
    ans2.push_back(p[l]);
}
signed main()
{
    int n;
    cin>>n;
    for(int i = 1; i<=n; i++){
         cin>>p[i];
    }
    build1(1, n);
    bool flag = false;
    if(ans2.size() == n){
        cout<<"YES"<<endl;
        for(int i = 0; i< ans2.size(); i++)
            if(i == 0) cout<<ans2[0];
            else cout<<' '<<ans2[i];
    }else{
        ans2.clear();
        build2(1, n);
        if(ans2.size() == n){
            cout<<"YES"<<endl;
            for(int i = 0; i< ans2.size(); i++)
            if(i == 0) cout<<ans2[0];
            else cout<<' '<<ans2[i];
        }
        else {
            cout<<"NO";
        }
    }
    cout<<endl;
	return 0;
}

L2-005 集合相似度

解题思路:STL yyds, 用set, find

L2-006 树的遍历

解题思路:思考过程如下,经典的知道其中两个遍历序列,求另一种,这里是求了层序遍历复杂点,求先序简单。

#include <bits/stdc++.h>
using namespace std;
const int N = 500;
struct node{
    int x, l, r;
}tree[N];
int last[N], mid[N];
int idx = 0;
vector<int > ans ;
int rebuild(int l1, int r1, int l2, int r2){
    int pos;
    if(l1 > r1) return -1;
    for(int i = l1; i<= r1; i++)
        if(mid[i] == last[r2]){
            pos = i; break;
        }
    idx++;
    int ret = idx;
    tree[ret].x = last[r2];
    tree[ret].l = rebuild( l1, pos-1, l2, l2+pos-1-l1);
    tree[ret].r = rebuild( pos+1, r1, l2+pos-l1, r2-1);
    return ret;
}
void bfs(){
    queue<int> q;
    q.push(1);
    ans.clear();
    while(q.size()){
        int tmp = q.front();
        q.pop();
        if(tree[tmp].l != -1) q.push(tree[tmp].l);
        if(tree[tmp].r != -1) q.push(tree[tmp].r);
        ans.push_back(tree[tmp].x);
    }
}
int main()
{
   int n;
    cin>>n;
    for(int i = 1; i<=n; i++)  cin>>last[i];
    for(int i = 1; i<=n; i++)  cin>>mid[i];
    int pos = rebuild( 1, n, 1, n);
    bfs();
    cout<<ans[0];
    for(int i=1; i<ans.size(); i++)
        cout<<' '<<ans[i];
    cout<<endl;
    return 0;
}

L2-007 家庭房产

解题思路:结构体,自定义比较函数,并查集,格式化输出,状态计数

首先读入,对所有存在的人计数,人的编号都4位,同时合并集合,使用临时容器,开始合并同集合的人数与房产,重新标记不重复找出所有的答案,再对答案进行排序输出。

AC代码:

#include <bits/stdc++.h>
#define ll long long 
#define rep(x, a, b) for(int x = a; x <= b; x++)
#define pre(x, a, b) for(int x = b; x >= a; x--)
using namespace std;
const int N = 1e4+10;
//家庭信息首先按人均面积降序输出,若有并列,则按成员编号的升序输出。
//并查集!,合并同一家人的信息,先合并,合并人数和房产信息,合并到家庭成员的最小编号的身上,边读边合并吗?
bool st[N], st2[N];
int f[N];
struct node{
    int id, cotm, sumh;
    ll sum;
}nd[N], ans[N], tmp[N];
bool cmp(node a, node b){
    if(a.sum*1.0* b.cotm != b.sum*1.0 * a.cotm) return a.sum*1.0* b.cotm > b.sum*1.0 * a.cotm;
    return a.id<b.id;
}
int find(int x){
    if(x == f[x]) return x;
    else find(f[x]);
}
void merge(int a, int b){
    int x = find(a), y = find(b);
    if(x > y) f[x] = y; 
    else f[y] = x;
}

int main()
{
   int n;
    int a, b ,c, d, tmpcot, tmparea;
    cin>>n;
    memset(st2, false, sizeof(st));
    memset(st, false, sizeof(st));
    for(int i = 0; i< N; i++) f[i] = i; //并查集初始化
    for(int i = 0; i< n; i++){
        cin>>a>>b>>c>>d;
        st[a] = true;
        if(b != -1) merge(a, b), st[b] = true;
        if(c != -1) merge(a, c) , st[c] = true;
        for(int j = 0; j< d; j++){
            cin>>b;
            if(b != -1) merge(b, a),st[b] = true;
        }
        cin>>tmpcot>>tmparea;
        nd[i].id = a;nd[i].cotm = d; nd[i].sumh = tmpcot; nd[i].sum = tmparea;
    }
    for(int i = 0; i<N; i++){
        int t = find(nd[i].id);
        tmp[t].sumh += nd[i].sumh;
        tmp[t].sum += nd[i].sum;
        if(st[i]) tmp[find(i)].cotm++;
    }
    int idx = 0;
    for(int i = 0; i<N; i++){
        int x = find(i);
        if(st[x] && !st2[x]){
            ans[idx].id = x;
            ans[idx].cotm = tmp[x].cotm;
            ans[idx].sumh = tmp[x].sumh;
            ans[idx].sum  = tmp[x].sum;
            idx++;
            st2[x] = true;
        }
    }
    sort(ans, ans+idx, cmp);
    cout<<idx<<endl;
    for(int i = 0; i< idx; i++){
        printf("%04d %d %.3lf %.3lf\n", ans[i].id, ans[i].cotm, (double)(ans[i].sumh*1.0/ans[i].cotm), ans[i].sum*1.0/ans[i].cotm);
    }
    return 0;
}

L2-008 最长对称子串

解题思路:字符串,指针

L2-009 抢红包

解题思路:自定义排序,结构体

L2-010 排座位

解题思路:数量级比较小,关系用二维矩阵记录,朋友的朋友,与敌人之间的共同朋友用并查集解决,再做个判断。

L2-011 玩转二叉树

解题思路:与L2-006 树的遍历差不多,样例树都长得一样6

L2-012 关于堆的判断

解题思路:考察了堆的特质,注意点是读入,读完之后要把整行都吸收了,不然会影响后面的判断。make_heap(a.begin(),a.end(),greater<int>());, 用容器也可以,自己简单的堆排序也可以

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3871.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据分析之道-基础知识(三)】元组

文章目录专栏导读1、元组简介2、元组创建3、元组查找操作4、元组删除操作5、元组修改操作6、元组增加操作7、元组内置函数专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作者&#xff0c;专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》&…

自动驾驶控制概况

文章目录1. 第一章行为决策在自动驾驶系统架构中的位置2. 路径跟踪控制的种类2.1 基于自行车模型的路径跟踪控制算法2.1.1 纯跟踪控制&#xff08;Pure Pursuit&#xff09;算法2.1.2 后轮反馈控制算法&#xff08;Rear wheel feedback&#xff09;2.1.3前轮反馈控制算法&#…

防火墙 NAT地址转换

网络地址转换&#xff08;NAT&#xff09;是一种用于访问Internet访问模式广域网&#xff08;WAN&#xff09;的技术&#xff0c;用于将私有&#xff08;保留&#xff09;地址转换为合法IP地址。NAT不仅能够有效地额抵抗外部网络攻击&#xff0c;还能够在IP地址分配不理想&…

Windows权限提升—令牌窃取、UAC提权、进程注入等提权

Windows权限提升—令牌窃取、UNC提权、进程注入等提权1. 前言2. at本地命令提权2.1. 适用范围2.2. 命令使用2.3. 操作步骤2.3.1. 模拟提权2.3.2. at配合msf提权2.3.2.1. 生成木马文件2.3.2.2. 设置监听2.3.2.3. 设置反弹2.3.2.4. 查看反弹效果3. sc本地命令提权3.1. 适用范围3.…

瑟瑟发抖吧——用了这款软件,我的开发效率提升了50%

一、前言 开发中&#xff0c;一直听到有人讨论是否需要重复造轮子&#xff0c;我觉得有能力的人&#xff0c;轮子得造。但是往往开发周期短&#xff0c;用轮子所节省的时间去更好的理解业务&#xff0c;应用到业务中&#xff0c;也能清晰发现轮子的利弊&#xff0c;一定意义上…

Warshall算法

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;> 算法 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我…

树莓派Linux源码配置,树莓派Linux内核编译,树莓派Linux内核更换

目录 一 树莓派Linux的源码配置 ① 内核源码下载说明 ② 三种方法配置源码 二 树莓派Linux内核编译 ① 内核编译 ② 编译时报错及解决方案&#xff08;亲测&#xff09; 三 更换树莓派Linux内核 操作步骤说明 ● dmesg报错及解决方案&#xff08;亲测&#xff0…

算法刷题笔记

特定方法 KMP算法&#xff1a;字符串匹配 逆波兰表达式&#xff1a;计算值 斐波那契数&#xff1a;动态规划 强制类型转换&#xff1a;整型->字符串&#xff1a;to_string&#xff0c;字符串->整型&#xff1a;stoi 一、数组 数组&#xff1a;下标从0开始&#xff0c;内存…

蓝桥杯嵌入式--LCD屏幕使用提升

前言之前在专栏里已经介绍过LCD相关库文件的移植&#xff0c;今天来介绍一下对于LCD屏幕的使用技巧。屏幕基本配置与函数一、屏幕初始化使用lcd前的必要步骤就是对LCD屏幕进行初始化操作&#xff0c;这也是一个容易忘记的操作。LCD_Init();\\使用lcd前的必要步骤就是对LCD屏幕进…

蓝桥杯倒计时 | 倒计时17天

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;蓝桥杯倒计时冲刺 描述&#x1f3a8;&#xff1a;蓝桥杯冲刺阶段&#xff0c;一定要沉住气&#xff0c;一步一个脚印&#xff0c;胜利就在前方&#xff01; 寄语&#x1f493;&#xff1a…

将一段数字转为字符串

将一段数字转为字符串 string turn(long long x){string str;while(x){int tx%10;// 数字0的ascii码为48&#xff01;char ct48;strc;// string类拼接方式x/10;}reverse(str.begin(),str.end()); // 不要忘了反转字符串return str; }例: #include<iostream> #include&l…

使用VS Code 配置Ubuntu远程C++开发环境

使用VS Code 配置Ubuntu远程C开发环境 环境准备 VS CodeWSL Ubuntu 虚拟机 配置步骤 在Ubuntu 中配置ssh远程登录 Ubuntu 配置远程登录 VsCode 安装 Remote-ssh 插件 打开vscode ssh configure ,填入相关信息 ​ Host : 主机名称&#xff0c;在左侧列表中显示的名称 ​ …

【Linux】[万字] Linux下的文件操作 及 Linux文件描述符fd 详解

在Linux操作系统中, 文件描述符是一个至关重要的概念. 理解了文件描述符, 其实就可以相当于理解了Linux系统的关于内存文件系统的整个大致框架和逻辑 但是在介绍文件描述符之前, Linux关于文件还存在许多 概念和文件操作 的知识需要介绍一下, 就当作是为解释文件描述符所做的…

IDEA连接Linux服务器进行文件操作

IDEA连接Linux服务器进行文件操作 文章目录IDEA连接Linux服务器进行文件操作连接的作用和意义安装openssh开启openssh服务验证是否开启服务安装网络工具包查看虚拟机IP地址Idea连接Linux虚拟机打开配置页面配置SFTP配置SSH完成后出现的配置文件安装big data tools插件连接的作用…

【RV1126】调试GT911,1024x600 7寸 MIPI 电容触摸屏

文章目录一、驱动注册失败二、触摸屏可以触摸&#xff0c;但是x轴数据反了三、可以触摸了&#xff0c;但是Y轴数据跳变&#xff0c;几乎只有一半的屏幕是可以正常滑动的三、汇顶触摸屏配置文件解析四、使用新的配置文件4.1 新配置解决问题4.2 测试触摸的方法在kernel增加frame …

【学习经验分享NO.21】学习资料分享(持续更新)

本博客将收集整理人工智能深度学习相关资料&#xff0c;进行整理&#xff0c;供大家学习使用。如果有需要帮忙整理的请留言。将不断更新&#xff0c;请持续关注。 一、深度学习论文资料 链接&#xff1a;https://pan.baidu.com/s/18LO5df0dp9-IE8Z3aFyrPg 提取码&#xff1a;c…

记录springboot+vue+fastdfs实现简易的文件(上传、下载、删除、预览)操作

前言说明&#xff1a;springboot vue FastDFS实现文件上传&#xff08;支持预览&#xff09;升级版 FASTDFS部分 FASTDFS安装过程&#xff1a;基于centos 7安装FastDFS文件服务器 SpringBoot部分 springboot源码实现 package com.core.doc.controller;import com.baomid…

【多线程】CAS

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; 目 录&#x1f40d;一. 什么是 CAS&#x1f98e;二. CAS 是怎么实现的&#x1f996;三. CAS 典型应用场景&#x1f436;1. 实现原子类&#x1f431;2. 实现自旋锁&#x1f995;四. …

进程间通信----信号量

文章目录信号量1. 问题2. 什么是信号量3. 信号量的使用4. 信号量的控制6. 实例信号量 1. 问题 程序中&#xff0c;有时存在一种特殊代码&#xff0c;最多只允许一个进程执行该部分代码。这部分区域&#xff0c;称为“临界区” 然而在多进程并发执行时&#xff0c;当一个进程进…

Pseudo-completeness(前中序遍历确定后序遍历)

题目链接&#xff1a;题目详情 - 7-16 Pseudo-completeness (pintia.cn) 样例1输入&#xff1a; 7 4 2 5 1 6 3 7 1 2 4 5 3 6 7样例1输出&#xff1a; 1 4 5 2 6 7 3 1样例2输入&#xff1a; 10 8 4 9 2 10 5 1 6 3 7 1 2 4 8 9 5 10 3 6 7样例2输出&#xff1a; 2 8 9 4…