【PAT甲级】1133 Splitting A Linked List (25分)

题意:

输入一个五位非负整数S,一个正整数N(<=100000,一个正整数K(1000),接着输入N行数据,每行包括一个结点的地址,结点的数据,下一个结点的地址(地址为五位非负数,数据为整数),输出处理后的顺序,处理过程为先把所有负的结点筛选出来以原本前后顺序排在链表初端,再把所有[0,K]的结点筛选出来以原本前后顺序排在链表中间,再把所有大于K的结点筛选出来以原本前后顺序排在链表尾端。

AAAAAccepted code:

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 int sserdda[100007];
 5 int address[100007],num[100007],nex[100007];
 6 int a[100007],b[100007];
 7 int ans[100007];
 8 int main(){
 9     //ios::sync_with_stdio(false);
10     //cin.tie(NULL);
11     //cout.tie(NULL);
12     int s,n,k;
13     scanf("%d%d%d",&s,&n,&k);
14     for(int i=1;i<=n;++i){
15         scanf("%d%d%d",&address[i],&num[i],&nex[i]);
16         sserdda[address[i]]=i;
17     }
18     int cnt=0;
19     while(1){
20         int x=sserdda[s];
21         a[++cnt]=address[x];
22         b[cnt]=num[x];
23         s=nex[x];
24         if(s==-1)
25             break;
26     }
27     int cnt2=0;
28     for(int i=1;i<=cnt;++i)
29         if(b[i]<0)
30             ans[++cnt2]=i;
31     for(int i=1;i<=cnt;++i)
32         if(b[i]>=0&&b[i]<=k)
33             ans[++cnt2]=i;
34     for(int i=1;i<=cnt;++i)
35         if(b[i]>k)
36             ans[++cnt2]=i;
37     for(int i=1;i<cnt2;++i)
38         printf("%05d %d %05d\n",a[ans[i]],b[ans[i]],a[ans[i+1]]);
39     printf("%05d %d -1",a[ans[cnt2]],b[ans[cnt2]]);
40     return 0;
41 }

 

posted @ 2020-06-18 22:53  sewage  阅读(228)  评论(0编辑  收藏  举报