Advertisement
walterb1

Untitled

Apr 9th, 2017
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.61 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4. #include <time.h>
  5. #include <math.h>
  6.  
  7.  
  8. #define minf(a, b) a < b? a : b
  9. #define maxf(a, b) a > b? a : b
  10.  
  11.  
  12. long *rss, *lss, lastls, lastrs, *precrow, *lastrow, nalloc;
  13. char *stalls;
  14.  
  15.  
  16. void place(long n, double ex, long k)
  17. {
  18.     long i, j, maxmin, maxmax, bestplace;
  19.     long temp;
  20.     double div;
  21.  
  22.     /*Primo caso, quando c'è solo la radice dell'albero*/
  23.     if (ex == 1)
  24.     {
  25.         bestplace = (long)round((double)n / 2);
  26.         lastrow = (long *)malloc(sizeof(long));
  27.         *lastrow = bestplace;      
  28.         stalls[bestplace] = '0';
  29.  
  30.         for (i = bestplace - 1; i > 0 && stalls[i] == '.'; i--)
  31.             rss[i] = bestplace - i - 1;
  32.  
  33.         for (i = bestplace + 1; i <= n && stalls[i] == '.'; i++)
  34.             lss[i] = i - bestplace - 1;
  35.  
  36.         lastrs = n - bestplace;
  37.         lastls = bestplace - 1;
  38.         nalloc++;
  39.         return;
  40.     }
  41.  
  42.     precrow = lastrow;
  43.  
  44.     /*Creazione nuova linea dell'albero*/
  45.  
  46.     lastrow = (long *)malloc((long)pow(2, ex - 1) * sizeof(long));
  47.  
  48.     div = pow(2, ex);
  49.     j = 0;
  50.  
  51.     for (i = 0; i < (long)(pow(2, ex - 2)); i++)
  52.     {
  53.         lastrow[j++] = (long)round((double)precrow[i] - (double)n / div);
  54.         lastrow[j++] = (long)round((double)precrow[i] + (double)n / div);
  55.     }
  56.  
  57.     maxmin = LONG_MIN;
  58.     maxmax = LONG_MIN;
  59.  
  60.     free(precrow);
  61.  
  62.     /*Valutazione di tutti gli elementi calcolati*/
  63.     temp = j;
  64.     for (j = 0; j < temp && nalloc < k; j++)
  65.     {
  66.         bestplace = n + 2;
  67.  
  68.         for (i = 0; i < temp; i++)
  69.         {
  70.             if (lastrow[i] > 0 && stalls[lastrow[i]] == '.') /*Scarta gli elementi già valutati o non validi*/
  71.             {
  72.                 if (minf(rss[lastrow[i]], lss[lastrow[i]]) > maxmin)
  73.                 {
  74.                     bestplace = lastrow[i];
  75.                     maxmin = minf(rss[lastrow[i]], lss[lastrow[i]]);
  76.                     maxmax = maxf(rss[lastrow[i]], lss[lastrow[i]]);
  77.                 }
  78.                 else if (maxf(rss[lastrow[i]], lss[lastrow[i]]) > maxmax)
  79.                 {
  80.                     bestplace = lastrow[i];
  81.                     maxmin = minf(rss[lastrow[i]], lss[lastrow[i]]);
  82.                     maxmax = maxf(rss[lastrow[i]], lss[lastrow[i]]);
  83.                 }
  84.                 else if (lastrow[i] < bestplace)
  85.                 {
  86.                     bestplace = lastrow[i];
  87.                     maxmin = minf(rss[lastrow[i]], lss[lastrow[i]]);
  88.                     maxmax = maxf(rss[lastrow[i]], lss[lastrow[i]]);
  89.                 }
  90.             }
  91.         }
  92.  
  93.         stalls[bestplace] = '0';
  94.  
  95.         /*Aggiorna le distanze per gli elementi più vicini*/
  96.         for (i = bestplace - 1; i > 0 && stalls[i] == '.'; i--)
  97.             rss[i] = bestplace - i - 1;
  98.  
  99.         for (i = bestplace + 1; i <= n && stalls[i] == '.'; i++)
  100.             lss[i] = i - bestplace - 1;
  101.  
  102.         lastrs = rss[bestplace];
  103.         lastls = lss[bestplace];
  104.  
  105.         nalloc++;
  106.     }
  107.  
  108.     return;
  109. }
  110.  
  111.  
  112. int main(int argc, char *argv[])
  113. {
  114.     FILE *fin, *fout;
  115.     long n, k, j;
  116.     int ncases, i;
  117.     double ex, clockstart, clockend;
  118.  
  119.     fin = fopen("C-small-2-attempt0.in", "r");
  120.     fout = fopen("output.txt", "w");
  121.  
  122.     fscanf(fin, "%d", &ncases);
  123.  
  124.     for (i = 1; i <= ncases; i++)
  125.     {
  126.         clockstart = (double)clock();
  127.  
  128.         fscanf(fin, "%d %d", &n, &k);
  129.  
  130.         ex = 1;
  131.  
  132.         rss = (long *)malloc((n + 2) * sizeof(long));
  133.         lss = (long *)malloc((n + 2) * sizeof(long));
  134.         stalls = (char *)malloc((n + 2) * sizeof(char));
  135.         nalloc = 0;
  136.  
  137.         for (j = 0; j < n + 2; j++)
  138.         {
  139.             if (j == 0 || j == n + 1)
  140.             {
  141.                 stalls[j] = 'X';
  142.                 rss[j] = -1;
  143.                 lss[j] = -1;
  144.             }
  145.             else
  146.             {
  147.                 stalls[j] = '.';
  148.                 rss[j] = n - j;
  149.                 lss[j] = n - 1;
  150.             }
  151.         }
  152.  
  153.         while (nalloc < k)
  154.         {
  155.             place(n, ex, k);
  156.             ex++;
  157.         }
  158.  
  159.         fprintf(fout, "Case #%d: %d %d", i, maxf(lastls, lastrs), minf(lastls, lastrs));
  160.  
  161.         clockend = (double)clock();
  162.         printf("Case #%d: %d %d solved in %.8f seconds\n", i, maxf(lastls, lastrs), minf(lastls, lastrs), (clockend - clockstart) / CLOCKS_PER_SEC);
  163.     }
  164.  
  165.     fclose(fin);
  166.     fclose(fout);
  167.  
  168.     return EXIT_SUCCESS;
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement