最后一个测试用例很坑,注意给出的n个节点不一定都在以h为头的链表上,这种测试用例在PAT链表相关的问题中多次出现,要予以注意。
AC代码
#include <vector> #include <map> #include <algorithm> #include <cstdio> using namespace std; class node{ public: int addr; int v; int next; }; int main(){ int h,n,k; scanf("%d %d %d",&h,&n,&k); vector<node> list; map<int,node> rec; for(int i = 0;i < n;i++){ node tmp; scanf("%d %d %d",&tmp.addr,&tmp.v,&tmp.next); rec[tmp.addr] = tmp; } int addr(h); int count(0); while(addr != -1){ list.push_back(rec[addr]); addr = rec[addr].next; } n = list.size(); if(n < k){ for(int i = 0;i < list.size();i++){ if(list[i].next != -1) printf("%05d %d %05d\n",list[i].addr,list[i].v,list[i].next); else printf("%05d %d -1\n",list[i].addr,list[i].v); } return 0; } for(int i = 0;i < n / k;i++){ reverse(list.begin() + i * k,list.begin() + (i+1) * k); for(int j = i * k;j < (i+1) * k;j++){ if(j != (i+1) * k - 1) list[j].next = list[j+1].addr; } } for(int i = 0;i < n / k;i++){ if((i+1) * k < n) list[i * k + k - 1].next = list[(i+1) * k].addr; else list[i * k + k - 1].next = -1; } list.back().next = -1; for(int i = 0;i < list.size();i++){ if(list[i].next != -1) printf("%05d %d %05d\n",list[i].addr,list[i].v,list[i].next); else printf("%05d %d -1\n",list[i].addr,list[i].v); } return 0; }
时间: 2024-10-21 12:49:01