2.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <limits.h>
  5. typedef struct dir Dir;
  6. #define LOG(s) fprintf(stderr, s"\n");
  7. struct dir {
  8. char name[32];
  9. Dir *parent;
  10. Dir *next_sibling;
  11. Dir *child;
  12. int size;
  13. };
  14. char buf[4096];
  15. Dir root = {0};
  16. int need = INT_MAX;
  17. int to_del = INT_MAX;
  18. int totalsize(Dir *dir) {
  19. if (dir == NULL) return 0;
  20. int total = dir->size;
  21. Dir *child = dir->child;
  22. while (child != NULL) {
  23. total += totalsize(child);
  24. child = child->next_sibling;
  25. }
  26. if (total >= need && total < to_del) to_del = total;
  27. return total;
  28. }
  29. void process_ls(FILE* fp, Dir *cur) {
  30. while (1) {
  31. int c = fgetc(fp);
  32. if (c == EOF) return;
  33. ungetc(c, fp);
  34. if (c == '$') {
  35. return;
  36. }
  37. buf[0] = '\0';
  38. fgets(buf, 4096, fp);
  39. if (buf[0] == 'd') {
  40. strtok(buf, " ");
  41. char *childname = strtok(NULL, "\n");
  42. Dir *newdir = malloc(sizeof(Dir));
  43. strcpy(newdir->name, childname);
  44. newdir->parent = cur;
  45. newdir->next_sibling = cur->child;
  46. newdir->child = NULL;
  47. newdir->size = 0;
  48. cur->child = newdir;
  49. } else {
  50. char *pos;
  51. long fsz = strtol(buf, &pos, 10);
  52. cur->size += fsz;
  53. }
  54. }
  55. }
  56. void process_cmd(FILE *fp, Dir **pcur) {
  57. Dir *cur = *pcur;
  58. char *cmd = strtok(buf + 2, " \n");
  59. if (strcmp(cmd, "cd") == 0) {
  60. char *param = strtok(NULL, " \n");
  61. if (strcmp(param, "/") == 0) {
  62. *pcur = &root;
  63. } else if (strcmp(param, "..") == 0) {
  64. *pcur = cur->parent;
  65. } else {
  66. Dir *t = cur->child;
  67. while (t != NULL) {
  68. if (strcmp(t->name, param) == 0) {
  69. *pcur = t;
  70. break;
  71. } else {
  72. t = t->next_sibling;
  73. }
  74. }
  75. }
  76. } else if (strcmp(cmd, "ls") == 0) {
  77. process_ls(fp, cur);
  78. }
  79. }
  80. int main() {
  81. FILE *fp = fopen("input", "r");
  82. Dir *cur = &root;
  83. while (fgets(buf, 4096, fp)) {
  84. int len = strlen(buf);
  85. if (len <= 1) continue;
  86. char c = buf[0];
  87. if (c == '$') {
  88. process_cmd(fp, &cur);
  89. }
  90. }
  91. int total = totalsize(&root);
  92. int unused = 70000000 - total;
  93. need = 30000000 - unused;
  94. totalsize(&root);
  95. printf("%d\n", to_del);
  96. }