Advertisement
a53

barci_oficiala

a53
Nov 26th, 2017
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.94 KB | None | 0 0
  1. //Paul Diac 100
  2. #include <cstdio>
  3. #include <string>
  4. #include <cassert>
  5. #include <cstdlib>
  6. #define NMax 1000000
  7. using namespace std;
  8.  
  9. int T = 10;
  10.  
  11. int N, C, B;
  12. int v[NMax];
  13.  
  14. struct man {
  15. int w, prev, next, barked;
  16. };
  17. man o[NMax];
  18.  
  19. int compDesc(const void *a, const void *b) {
  20. return *(int*)b - *(int*)a;
  21. }
  22.  
  23. int validTogether(int i, int j) {
  24. return (0 <= i && i < N && 0 <= j && j < N && o[i].barked == 0 && o[j].barked == 0 &&
  25. i < j && o[i].w + o[j].w <= C && o[i].w - o[j].w <= B && o[j].w - o[i].w <= B);
  26. }
  27.  
  28. void remove(int &idx) {
  29. o[idx].barked = 1;
  30. o[o[idx].prev].next = o[idx].next;
  31. o[o[idx].next].prev = o[idx].prev;
  32. idx = o[idx].next;
  33. }
  34.  
  35. int main() {
  36.  
  37. string fname = "barci";
  38. FILE *fin = fopen((fname + ".in").c_str(), "rt");
  39. FILE *fout = fopen((fname + ".out").c_str(), "wt");
  40.  
  41. fscanf(fin, "%d %d %d", &N, &C, &B);
  42.  
  43. assert(N <= 100000);
  44. assert(C <= 1000000000);
  45. assert(B <= 1000000000);
  46.  
  47. assert(1 <= N);
  48. assert(1 <= C);
  49. assert(0 <= B);
  50.  
  51. for (int i = 0; i < N; i++) {
  52. fscanf(fin, "%d", &v[i]);
  53. assert(v[i] <= v[i]);
  54. assert(1 <= v[i]);
  55. }
  56. qsort(v, N, sizeof(v[0]), compDesc);
  57.  
  58. for (int i = 0; i < N; i++) {
  59. o[i].w = v[i];
  60. o[i].next = i+1;
  61. o[i].prev = i-1;
  62. o[i].barked = 0;
  63. }
  64. o[N].prev = N-1;
  65.  
  66. int left;
  67. for (left = N-1; left >= 0 && o[0].w + o[left].w <= C; left--);
  68. left++; // left end of interval with valid pair of current man
  69.  
  70. int boats = 0;
  71. for (int i = 0; i < N; i++) if (!o[i].barked) {
  72.  
  73. if (left == i) {
  74. left = o[left].next;
  75. }
  76.  
  77. // left is always on the right (and smaller than) i.
  78. // and all left of i are barked
  79.  
  80. while (o[left].prev > i && o[i].w + o[o[left].prev].w <= C) {
  81. left = o[left].prev;
  82. }
  83.  
  84. if (validTogether(i, left)) {
  85. //fprintf(fout, "%d %d\n", o[i].w, o[left].w);
  86. remove(left);
  87. }
  88. o[i].barked = 1;
  89. boats++;
  90. }
  91.  
  92. fprintf(fout, "%d\n", boats);
  93.  
  94. fclose(fin);
  95. fclose(fout);
  96.  
  97. return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement