Advertisement
Guest User

Untitled

a guest
Nov 25th, 2015
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.28 KB | None | 0 0
  1. /* Created by Federico Bento & Ricardo Azevedo */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. #define MAX 1000000
  7.  
  8. void merge(int v[], int start, int middle, int end) {
  9.   int i, p1, p2, aux[MAX];
  10.  
  11.   p1=start;     // "Apontador" do array da metade esquerda
  12.   p2=middle+1;  // "Apontador" do array da metade direita
  13.   i = start;    // "Apontador" do array aux[] a conter juncao
  14.   while (p1<=middle && p2<=end) {            // Enquanto de para comparar
  15.     if (v[p1] <= v[p2]) aux[i++] = v[p1++];  // Escolher o menor e adicionar
  16.     else                aux[i++] = v[p2++];
  17.   }
  18.   while (p1<=middle) aux[i++] = v[p1++];     // Adicionar o que resta
  19.   while (p2<=end)    aux[i++] = v[p2++];
  20.  
  21.   for (i=start; i<=end; i++) v[i] = aux[i];  // Copiar array aux[] para v[]
  22. }
  23.  
  24. void mergesort(int v[], int start, int end) {
  25.   int middle;
  26.   if (start<end) {                 // Parar quando tamanho do array < 2
  27.     middle = (start+end)/2;        // Calcular ponto medio
  28.     mergesort(v, start, middle);   // Ordenar metade esquerda
  29.     mergesort(v, middle+1, end);   // Ordenar metade direita
  30.     merge(v, start, middle, end);  // Combinar duas metades ordenadas
  31.   }
  32. }
  33.  
  34. void binsearch(int v[], int start, int end, int key)
  35. {
  36.     if(key > v[end]) {
  37.         printf("%d\n", v[end]);
  38.         return;
  39.     }
  40.    
  41.     if(key < v[start]) {
  42.         printf("%d\n", v[start]);
  43.         return;
  44.     }
  45.  
  46.     int middle;
  47.     while(start < end) {
  48.         middle = start + (end-start)/2;
  49.         if(key < v[middle])
  50.             end = middle;
  51.         else
  52.             start = middle + 1;
  53.     }
  54.     if(start == 0) printf("%d\n", v[start]);
  55.     else if(v[start] == key) printf("%d\n", key);
  56.     else if(v[start-1] == key) printf("%d\n", key);
  57.     else if(abs(v[start]-key) == abs(v[start-1]-key)) printf("%d %d\n", v[start-1], v[start]);
  58.     else if(abs(v[start]-key) < abs(v[start-1]-key)) printf("%d\n", v[start]);
  59.     else printf("%d\n", v[start-1]);
  60.  
  61. }
  62.  
  63. int main()
  64. {
  65.     int i, j, n, k = 0;
  66.     scanf("%d", &n);
  67.     int array[n];
  68.     int sum[MAX];
  69.    
  70.     for(i = 0; i < n; i++)
  71.         scanf("%d", &array[i]);
  72.  
  73.     for(i = 0; i < n; i++) {
  74.         for(j = i+1; j < n; j++) {
  75.             sum[k] = array[i] + array[j];
  76.             k++;
  77.         }
  78.     }
  79.  
  80.     mergesort(sum, 0, k-1);
  81.    
  82.     scanf("%d", &n);
  83.     int key[n];
  84.    
  85.     for(i = 0; i < n; i++)
  86.         scanf("%d", &(*(i+key)));
  87.    
  88.     for(i = 0; i < n; i++)
  89.         binsearch(sum, 0, k-1, key[i]);
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement