中国石油大学天梯赛真题模拟第六场

L2-4 链表去重 (25 分)

给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。

输入格式:

输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤10?5??,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 -1 来表示。

随后 N 行,每行按以下格式描述一个结点:

地址 键值 下一个结点

其中地址是该结点的地址,键值是绝对值不超过10?4??的整数,下一个结点是下个结点的地址。

输出格式:

首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。

输入样例:

00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854

输出样例:

00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1

训练时老老实实模拟的链表没过。。。。

#include"bits/stdc++.h"

using namespace std;

const int maxn = 1e6 + 1000;
int vis[maxn];

struct node {
    int val, as;
    int last, next;
} e[maxn], d[maxn];
int last = -1;
int rootd = -1;

void del(int id) {
    if (last == -1) {
        last = 0;
        rootd = 0;
        d[0].val = e[id].val;
        d[0].next = -1;
    } else {
        d[last].next = id;
        d[id].val = e[id].val;
        d[id].next = -1;
        last = id;
    }
    e[e[id].last].next = e[id].next;
    e[e[id].next].last = e[id].last;

}

void dfs(int now) {
    if (now == -1) return;
    if (!vis[e[now].as]) {
        vis[e[now].as] = 1;
        dfs(e[now].next);
    } else {
        int next = e[now].next;
        del(now);
        dfs(next);
    }
}

int main() {
    int root, n;
    int id, val, next;
    cin >> root >> n;
    for (int i = 0; i < n; i++) {
        cin >> id >> val >> next;
        e[id].val = val;
        if (val < 0) val *= -1;
        e[id].as = val;
        e[id].next = next;
        if (next != -1) {
            e[next].last = id;
        }
    }
    dfs(root);
    while (root != -1) {
        if(e[root].next==-1){
            printf("%05d %d %d\n", root, e[root].val, e[root].next);

        }else
        printf("%05d %d %05d\n", root, e[root].val, e[root].next);
        root = e[root].next;
    }
    while (rootd != -1) {
        if (d[rootd].next == -1) {
            printf("%05d %d %d\n", rootd, d[rootd].val, d[rootd].next);

        } else
            printf("%05d %d %05d\n", rootd, d[rootd].val, d[rootd].next);
        rootd = d[rootd].next;
    }
    return 0;
}

至今不知道为什么WA的代码

#include"bits/stdc++.h"

using namespace std;

const int maxn = 1e6 + 1000;
struct node {
    int val, next;
} a[maxn];
int b[maxn];
int vis[maxn];

int main() {
    int head, n;
    cin >> head >> n;
    int pos, val, ne;
    for (int i = 0; i < n; i++) {
        cin >> pos >> val >> ne;
        a[pos].val = val;
        a[pos].next = ne;
    }
    printf("%05d %d", head, a[head].val);
    vis[abs(a[head].val)] = 1;
    int t = head;
    int tot = 0;
    while (1) {
        t = a[t].next;
        if (t == -1) {
            printf(" -1\n");
            break;
        }
        int ab = abs(a[t].val);
        if (vis[ab]) {
            b[tot++] = t;
        } else {
            vis[ab] = 1;
            printf(" %05d\n%05d %d", t, t, a[t].val);
        }
    }
    if (tot > 0) {
        printf("%05d %d", b[0], a[b[0]].val);
        for (int i = 1; i < tot; i++) {
            printf(" %05d\n%05d %d", b[i], b[i], a[b[i]].val);
        }
        printf(" -1\n");
    }
    return 0;
}

AC

 

原文地址:https://www.cnblogs.com/albert-biu/p/10556125.html

时间: 2024-11-09 04:26:33

中国石油大学天梯赛真题模拟第六场的相关文章

PAT 天梯赛真题集(L2、L3)

题意:求点权最大的最短路,输出最短路径条数.点权值.以及最大点权的路径. 做法:Dijstra求最短路,两步:1.找最小点:2.更新路径.这题的1不变,变的是2.在更新新路径的时候,如果找到更短的路径,那么更新点权.方案数:如果路径和最短路径一样,那么比较谁的点权大,更新为点权大的结果. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

2017年ICPC中国大陆区域赛真题(下)

2017年ICPC中国大陆区域赛真题(下) A - Lovers #include <bits/stdc++.h> using namespace std; const int maxn=2e5+10; int n,k,a[maxn],b[maxn],ans; int main() { int _; scanf("%d", &_); while (_--) { scanf("%d%d", &n, &k); for (int i =

天梯赛L1-049(模拟+vector的使用)

链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805081289900032: 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手.令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后.从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是

HDU 5122 K.Bro Sorting(2014北京区域赛现场赛K题 模拟)

这题定义了一种新的排序算法,就是把一串序列中的一个数,如果它右边的数比它小 则可以往右边移动,直到它右边的数字比它大为止. 易得,如果来模拟就是O(n^2)的效率,肯定不行 想了一想,这个问题可以被转化成 求这一串序列当中每个元素,它的右边是否存在小于它的数字,如果存在,则++ans 一开始没想到诶= = 不应该不应该 1 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler 2 #include <std

算法笔记_111:第五届蓝桥杯软件类省赛真题(Java本科A组)试题解答

 目录 1 猜年龄 2 李白打酒 3 神奇算式 4 写日志 5 锦标赛 6 六角填数 7 绳圈 8 兰顿蚂蚁 9 斐波那契 10 波动数列   前言:以下试题解答代码部分仅供参考,若有不当之处,还请路过的同学提醒一下~ 1 猜年龄 标题:猜年龄 小明带两个妹妹参加元宵灯会.别人问她们多大了,她们调皮地说:"我们俩的年龄之积是年龄之和的6倍".小明又补充说:"她们可不是双胞胎,年龄差肯定也不超过8岁啊." 请你写出:小明的较小的妹妹的年龄. 注意: 只写一个人的年龄数

算法笔记_108:第四届蓝桥杯软件类省赛真题(JAVA软件开发本科A组)试题解答

 目录 1 世纪末的星期 2 振兴中华 3 梅森素数 4 颠倒的价牌 5 三部排序 6 逆波兰表达式 7 错误票据 8 带分数 9 剪格子 10 大臣的旅费 前言:以下试题解答代码部分仅供参考,若有不当之处,还请路过的同学提醒一下~ 1 世纪末的星期 标题: 世纪末的星期 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日,如果是星期一则会.... 有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!! 于是,"谣言制造商&qu

第五届蓝桥杯Java组大学校园选拔真题_n级台阶

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: 蓝桥杯赛题 * 作    者:   彭俊豪 * 完成日期:   2016   年 04月 01日 * 版 本 号:      001 * 对任务及求解方法的描述部分 * 问题描述: 有n级台阶.从地面(第0级)出发,首先连续的上台阶,上到不超过第n级的某一个位置后再连续的下台阶,直到回到地面.若每次

2015年第六届蓝桥杯省赛真题(自己已懂的题目)

1.问题描述:奖券数目 有些人很迷信数字,比如带"4"的数字,认为和"死"谐音,就觉得不吉利. 虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位数(10000-99999), 要求其中不要出现带"4"的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张. 请提交该数字(一个整数),不要写任何多余的内容或说明性文字. 思路:5重循环,第一重为1-9,其余为0-9(这样就可以遍历10000到9999