提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
最近要考pat了,正在复习甲级算法题
看了一些答主A1165的解法,不太理解,自己又写了一篇较为浅显的题解,希望大家看完能有所收获!
简单来说就是排序,将不同块段的结点赋上不同的段值,相同的段中即附上对应的先后顺序,然后排序呀~
代码如下(示例):
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
struct node{
int id;
int data;
int next;
int block=-1;
int loc_rank=-1;
}a[100010];
bool cmp(node &a,node &b){
if(a.block!=b.block){
return a.block>b.block;
}else{
return a.loc_rank<b.loc_rank;
}
}
int main(){
int first,n,k,tempid,data,next;
scanf("%d %d %d",&first,&n,&k);
for(int i=0;i<n;i++){
scanf("%d %d %d",&tempid,&data,&next);
a[tempid].id=tempid;
a[tempid].data=data;
a[tempid].next=next;
}
vector<node>ans;
int block=1,loc_rank=1;
for(int i=first;i!=-1;i=a[i].next,loc_rank++){
a[i].block=block;
a[i].loc_rank=loc_rank;
if(loc_rank%k==0){
loc_rank=0;
block++;
}
ans.push_back(a[i]);
}
sort(ans.begin(),ans.end(),cmp);
for(int i=0;i<ans.size();i++){
if(i!=ans.size()-1){
printf("%05d %d %05d\n",ans[i].id,ans[i].data,ans[i+1].id);
}else{
printf("%05d %d -1\n",ans[i].id,ans[i].data);
}
}
return 0;
}
总结
pat中链表的题目一般用静态链表即可解答~谢谢各位的观看