题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805425780670464
这题本来看了解题模版以后觉得很简单,但还是有一些地方要注意。
flag用来标记结点,虽然模版里没说,但感觉必用,用了会很方便不是必用,在题目给定的是一定同属于一个链表的结点时不需要flag- flag的true要在遍历初始化key的时候置
- cmp比较函数的编写,一般是两级,通过flag将不在链里面的都放到后面去
- 格式化输出%05d的时候需要特殊处理-1
- 这题的输出很神奇,我一开始都没反应过来,它实际上并没有修改结点的next,而是单纯将结点后面一个结点的地址输出了而已,我也是服了
代码
#include<vector>#include<algorithm>#include<iostream>using namespace std;const int maxn = 100010;struct Node{int address, key, next;bool flag;}node[maxn];bool cmp(Node a, Node b){if(a.flag == false || b.flag == false) return a.flag > b.flag;else return a.key < b.key;}int main(){for(int i = 0; i < maxn; i++){node[i].flag = false;}int n, s1;scanf("%d%d", &n, &s1);int address, key, next;for(int i = 0; i < n; i++){scanf("%d%d%d", &address, &key, &next);node[address].key = key;node[address].next = next;node[address].address = address;}int p = s1, count = 0;while(p != -1){node[p].flag = true;count++;p = node[p].next;}sort(node, node + maxn, cmp);if(count == 0){printf("0 -1\n");return 0;}printf("%d %05d\n", count, node[0].address);for(int i = 0; i < count; i++){if(i != count -1) printf("%05d %d %05d\n", node[i].address, node[i].key, node[i+1].address);else printf("%05d %d -1\n", node[i].address, node[i].key);}return 0;}
