码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-03-19 01:33:04      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:click   mat   play   重复   bsp   描述   输入   eve   show   

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

 

 

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

标签:click   mat   play   重复   bsp   描述   输入   eve   show   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!