【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 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)