题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805296180871168

这道题不是很难,写了一会,主要是没理解清楚题意,机试的时候一定要多多注意!!
重点是42-44行反转那里,其他都是题意没理解懂,模版题

代码

  1. #include<vector>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstdio>
  5. #include<math.h>
  6. using namespace std;
  7. const int maxn = 100010;
  8. struct Node{
  9. int address, data, next;
  10. bool flag;
  11. int order;
  12. }node[maxn];
  13. bool cmp(Node a, Node b){
  14. if(a.flag == false || b.flag == false) return a.flag > b.flag;
  15. return a.order < b.order;
  16. }
  17. int main(){
  18. for(int i = 0; i < maxn; i++){
  19. node[i].flag = false;
  20. node[i].order = maxn;
  21. }
  22. int begin, n, k;
  23. scanf("%d%d%d", &begin, &n, &k);
  24. int address, data, next;
  25. for(int i = 0; i < n; i++){
  26. scanf("%d%d%d", &address, &data, &next);
  27. node[address].address = address;
  28. node[address].data = data;
  29. node[address].next = next;
  30. }
  31. int p = begin, count = 0;
  32. while(p != -1){
  33. node[p].order = count;
  34. node[p].flag = true;
  35. p = node[p].next;
  36. count++;
  37. }
  38. sort(node, node + maxn, cmp);
  39. for(int i = 0; i < count / k ; i++){
  40. //printf("i = %d\n",i);
  41. reverse(node + i * k, node + (i + 1) * k);
  42. }
  43. //if(count % 4 == 0) reverse(node + count - 4, node + count);
  44. for(int i = 0; i < count; i++){
  45. if(i != count - 1) printf("%05d %d %05d\n", node[i].address, node[i].data, node[i + 1].address);
  46. else printf("%05d %d -1\n", node[i].address, node[i].data);
  47. }
  48. return 0;
  49. }