Advertisement
duke

Dělení kořisti

May 8th, 2011
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.40 KB | None | 0 0
  1. /*
  2.  * File:   main.c
  3.  * Author: duke
  4.  *
  5.  * Created on 6. květen 2011, 15:10
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10.  
  11. /*
  12.  *
  13.  */
  14.  
  15. void quicks(unsigned int *pole, const unsigned int levy_usek, const unsigned int pravy_usek) {
  16.     unsigned int levy, pravy;
  17.     unsigned int pivot, pom;
  18.  
  19.     levy = levy_usek;
  20.     pravy = pravy_usek;
  21.  
  22.     pivot = pole[(levy + pravy) / 2]; // vybereme pivota
  23.     //printf("pivot: pole[%u] = %u\n", (levy + pravy) / 2, pivot);
  24.  
  25.     do {
  26.         while (pole[levy] < pivot)
  27.             levy++;
  28.         while (pivot < pole[pravy])
  29.             pravy--;
  30.  
  31.         if (levy <= pravy) {
  32.             pom = pole[levy];
  33.             pole[levy] = pole[pravy];
  34.             pole[pravy] = pom;
  35.             levy++;
  36.             pravy--;
  37.         }
  38.  
  39.     } while (levy <= pravy);
  40.     if (levy_usek < pravy)
  41.         quicks(pole, levy_usek, pravy); // razeni leve casti
  42.     if (levy < pravy_usek)
  43.         quicks(pole, levy, pravy_usek); // razeni prave casti
  44. }
  45.  
  46. int main(int argc, char** argv) {
  47.  
  48.     long int predmety[20];
  49.     int pocetPredmetu;
  50.     unsigned int v, i = -1, suma = 0, prvni = 0, druhy = 0, treti = 0, prumer;
  51.  
  52.     printf("Zadejte pocet predmetu:\n");
  53.  
  54.     v = scanf("%d", &pocetPredmetu);
  55.  
  56.     if (v != 1 || pocetPredmetu < 3) {
  57.         printf("---Vysledky---\n");
  58.         printf("Nespravny vstup.\n");
  59.         exit(1);
  60.     }
  61.  
  62.     printf("Zadejte cenu jednotlivych predmetu:\n");
  63.  
  64.     for (i = 0; i < pocetPredmetu; i++) {
  65.         v = scanf("%d", &predmety[i]);
  66.         suma = suma + predmety[i]; // pocitani celkoveho souctu
  67.         if (v != 1) {
  68.             printf("---Vysledky---\n");
  69.             printf("Nespravny vstup.\n");
  70.             exit(1);
  71.         }
  72.     }
  73.  
  74.     for (i = 0; i < pocetPredmetu; i++) { // kontrola kladnosti hodnot, protoze to jinak asi nejde
  75.         if (predmety[i] <= 0) {
  76.             printf("---Vysledky---\n");
  77.             printf("Nespravny vstup.\n");
  78.             exit(1);
  79.         }
  80.     }
  81.  
  82.  
  83.    
  84.     //printf("suma je: %d\nMod3 = %d\n", suma, suma % 3);
  85.  
  86.     if (suma % 3 != 0) { // pokud neni soucet delitelny tremi
  87.         printf("---Vysledky---\n");
  88.         printf("Predmety nelze rozdelit spravedlive.\n");
  89.         exit(1);
  90.     }
  91.  
  92.     prumer = suma / 3;
  93.  
  94.     for (i = 0; i < pocetPredmetu; i++) { // pokud je nejaky predmet vetsi, nez ma kazdy mit
  95.         //printf("predmet %d ma hodnotu %d\n", i, predmety[i]);
  96.         if (predmety[i] > prumer) {
  97.             printf("---Vysledky---\n");
  98.             printf("Predmety nelze rozdelit spravedlive.\n");
  99.             exit(1);
  100.         }
  101.     }
  102.    
  103.     quicks(predmety, 0, pocetPredmetu - 1); // serazeni pole pro dalsi pocitani
  104.  
  105.     i = pocetPredmetu - 1;
  106.     do { // prvni dostava
  107.         if (i < 0) { // kdyz uz neni z ceho brat
  108.             printf("---Vysledky---\n");
  109.             printf("Predmety nelze rozdelit spravedlive.\n");
  110.             exit(1);
  111.         }
  112.         if (prvni + predmety[i] <= prumer) { // zkusime mu dat nejvice hodnotny kus
  113.             prvni = prvni + predmety[i];
  114.             predmety[i] = 0; // predmet uz neni volny
  115.         }
  116.         i--; // presun na mene nahodny kus
  117.     } while (prvni < prumer); // pokud jeste nema dost
  118.  
  119.     i = pocetPredmetu - 1;
  120.     do { // druhy dostava
  121.         if (i < 0) { // kdyz uz neni z ceho brat
  122.             printf("---Vysledky---\n");
  123.             printf("Predmety nelze rozdelit spravedlive.\n");
  124.             exit(1);
  125.         }
  126.         if (druhy + predmety[i] <= prumer) { // zkusime mu dat nejvice hodnotny kus
  127.             druhy = druhy + predmety[i];
  128.             predmety[i] = 0; // predmet uz neni volny
  129.         }
  130.         i--; // presun na mene nahodny kus
  131.     } while (druhy < prumer); // pokud jeste nema dost
  132.  
  133.     i = pocetPredmetu - 1;
  134.     do { // treti dostava
  135.         if (i < 0) { // kdyz uz neni z ceho brat
  136.             printf("---Vysledky---\n");
  137.             printf("Predmety nelze rozdelit spravedlive.\n");
  138.             exit(1);
  139.         }
  140.         if (treti + predmety[i] <= prumer) { // zkusime mu dat nejvice hodnotny kus
  141.             treti = treti + predmety[i];
  142.             predmety[i] = 0; // predmet uz neni volny
  143.         }
  144.         i--; // presun na mene nahodny kus
  145.     } while (treti < prumer); // pokud jeste nema dost
  146.  
  147.     // v tuto chvili maji vsichni stejne
  148.  
  149.     printf("---Vysledky---\n");
  150.     printf("Predmety lze rozdelit spravedlive.\n");
  151.  
  152.     return (EXIT_SUCCESS);
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement