#include<iostream>usingnamespace std;constint N =1e5+10;int n;int h1, h2, ne[N];char e[N];bool st[N];intmain(){scanf("%d%d%d",&h1,&h2,&n);int address, next;char data;for(int i =0; i < n; i ++){scanf("%d %c %d",&address,&data,&next);e[address]= data, ne[address]= next;}for(int i = h1;~i; i = ne[i])st[i]=true;for(int i = h2;~i; i = ne[i])if(st[i]){printf("%05d\n", i);return0;}puts("-1");}
#include<iostream>#include<unordered_map>#include<vector>#include<algorithm>usingnamespace std;structNode{string address;int key;string next;booloperator<(const Node& t)const{return key < t.key;}};intmain(){int n;char head[10];scanf("%d %s",&n, head);unordered_map<string, Node> map;char address[10], next[10];int key;while(n --){scanf("%s %d %s", address,&key, next);map[address]={address, key, next};}vector<Node> nodes;for(string i = head; i !="-1"; i = map[i].next) nodes.push_back(map[i]);printf("%d ",(int)nodes.size());if(nodes.empty())puts("-1");else{sort(nodes.begin(), nodes.end());printf("%s\n", nodes[0].address.c_str());for(int i =0; i < nodes.size(); i ++){if(i +1== nodes.size())printf("%s %d -1", nodes[i].address.c_str(), nodes[i].key);elseprintf("%s %d %s\n", nodes[i].address.c_str(), nodes[i].key, nodes[i +1].address.c_str());}}}
1074 Reversing Linked List (25 分)
題意 :
給一個鏈表和一個k,要求每k個結點為一組逆序,輸出逆序后的鏈表
思路 :
按邏輯順序將鏈表的地址放入vector中
注意輸出鏈表的時候不是輸出ne,而是輸出q[i + 1]
#include<iostream>#include<vector>#include<algorithm>usingnamespace std;constint N =1e5+10;int n, head, m;int e[N], ne[N];intmain(){scanf("%d%d%d",&head,&n,&m);int address, data, next;for(int i =0; i < n; i ++){scanf("%d%d%d",&address,&data,&next);e[address]= data, ne[address]= next;}vector<int> q;for(int i = head;~i; i = ne[i]) q.push_back(i);for(int i =0; i + m -1< q.size(); i += m ){reverse(q.begin()+ i, q.begin()+ i + m);}for(int i =0; i < q.size(); i ++){printf("%05d %d ", q[i], e[q[i]]);if(i != q.size()-1)printf("%05d\n", q[i +1]);elseprintf("-1\n");}}
1097 Deduplication on a Linked List (25 分)
題意 :
data deduplication 重復元素刪除
#include<iostream>#include<cstring>#include<vector>usingnamespace std;constint N =100010;int n;int h, e[N], ne[N];bool st[N];intmain(){scanf("%d%d",&h,&n);for(int i =0; i < n; i ++){int address, key, next;scanf("%d%d%d",&address,&key,&next);e[address]= key, ne[address]= next;}vector<int> a, b;for(int i = h; i !=-1; i = ne[i]){int v =abs(e[i]);if(st[v]) b.push_back(i);else{st[v]=true;a.push_back(i);}}for(int i =0; i < a.size(); i ++){printf("%05d %d ", a[i], e[a[i]]);if(i +1== a.size())puts("-1");elseprintf("%05d\n", a[i +1]);}for(int i =0; i < b.size(); i ++){printf("%05d %d ", b[i], e[b[i]]);if(i +1== b.size())puts("-1");elseprintf("%05d\n", b[i +1]);}return0;}
1133 Splitting A Linked List (25 分)
題意 :
Splitting A Linked List 鏈表元素分類
給定一個單鏈表,請編寫程序將鏈表元素進行分類排列,使得所有負值元素都排在非負值元素的前面,而 [0,K] 區間內的元素都排在大于 K 的元素前面。
#include<iostream>#include<cstring>#include<vector>usingnamespace std;constint N =100010;int n, k;int h, e[N], ne[N];intmain(){scanf("%d%d%d",&h,&n,&k);for(int i =0; i < n; i ++){int address, key, next;scanf("%d%d%d",&address,&key,&next);e[address]= key, ne[address]= next;}vector<int> a, b, c;for(int i = h; i !=-1; i = ne[i]){int v = e[i];if(v <0) a.push_back(i);elseif(v <= k) b.push_back(i);else c.push_back(i);}a.insert(a.end(), b.begin(), b.end());a.insert(a.end(), c.begin(), c.end());for(int i =0; i < a.size(); i ++){printf("%05d %d ", a[i], e[a[i]]);if(i +1== a.size())puts("-1");elseprintf("%05d\n", a[i +1]);}return0;}