Advertisement
VSZM

Csapadék állások

Jan 7th, 2016
177
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. /*
  6. Programozási alapismeretek 2. évfolyam ZH 2016. január
  7. 1. oldal
  8. Eső
  9. Az elmúlt N hétben minden nap megmértük a lehullott csapadék mennyiségét, milliméterben.
  10. Írj programot, amely megadja az alábbiakat
  11.  minden hétre a lehullott csapadék mennyiségét;
  12.  a legcsapadékosabb hetet;
  13.  azon heteket, amikor a csapadékmennyiség a héten belül folyamatosan nőtt;
  14.  azon N/2 hetes időszakot, amikor a legkevesebb napon esett az eső;
  15.  a leghosszabb időszakot, amikor minden héten legfeljebb 10 mm eső volt!
  16. Bemenet
  17. A standard bemenet első sora a hetek számát tartalmazza (2≤N≤1000). A következő N
  18. sorban egy-egy hét 7 csapadékmennyisége található (0≤Ci,j≤1000).
  19. Kimenet
  20. A standard kimenetre 5 sort kell írni! Az 1. sor N száma az N hét csapadék mennyisége
  21. legyen! A második sorba a legcsapadékosabb hét sorszámát kell kiírni (több megoldás esetén a
  22. legkisebb sorszámút)! A harmadik sorba azon hetek M számát, majd az M hét sorszámát kell kiírni,
  23. növekvő sorrendben, amelyeken belül a csapadékmennyiség folyamatosan nőtt! A negyedik sorba
  24. azon N/2 hetes időszak első hete sorszámát kell írni, ami alatt a legkevesebb napon esett az eső
  25. (több megoldás esetén a legkisebb sorszámút)! Az ötödik sorba a leghosszabb időszak első és
  26. utolsó hete sorszáma kerüljön, amikor minden héten legfeljebb 10 mm eső volt (több megoldás
  27. esetén a legkisebb sorszámú)! Ha nincs ilyen hét, akkor az egyetlen 0 számot kell kiírni.
  28. Példa
  29. Bemenet                 Kimenet
  30. 6                       140 2 4 21 9 0
  31. 5 10 15 20 25 30 35     1
  32. 0 2 0 0 0 0 0           2 1 4
  33. 0 0 0 1 0 3 0           2
  34. 0 1 2 3 4 5 6           2 3
  35. 5 1 0 0 2 1 0
  36. 0 0 0 0 0 0 0
  37. Korlátok
  38. Időlimit: 0.1 mp.
  39. Memórialimit: 32 MiB
  40. Ha a részfeladatok valamelyikét nem tudod megoldani, akkor az eredménye helyett egy üres sort
  41. írj ki!
  42. Értékelés
  43. Értékelés 10 teszt-adatfájl alapján:
  44. Összpont: 10*(2+2+2+3+3)=10*12=120 pont
  45. Alsópont: 40 60 80 100
  46. Jegy: 2 3 4 5
  47. */
  48.  
  49. int main()
  50. {
  51.     int N;
  52.     const int MAX_N = 100;
  53.     cin >> N;
  54.  
  55.     int CSM[MAX_N][7];// Csapadék Mátrix
  56.     int heti_csapadek[MAX_N];
  57.     bool novekvo_hetek[MAX_N];
  58.  
  59.     // Beolvasás
  60.     for (int i = 0; i < N; ++i)
  61.     {
  62.         for (int j = 0; j < 7; ++j)
  63.         {
  64.             cin >> CSM[i][j];
  65.         }
  66.     }
  67.  
  68.  
  69.     for (int i = 0; i < N; ++i) {// 1. és 3. feladatrész
  70.         int sum_het = 0;
  71.         bool novekszik = true;// TFH Növekszik
  72.         for (int j = 0; j < 6; ++j) {
  73.             if (CSM[i][j] >= CSM[i][j + 1])// Próbáljuk bebizonyítani az ellenkezőjét
  74.                 novekszik = false;
  75.         }
  76.  
  77.         novekvo_hetek[i] = novekszik;
  78.  
  79.         for (int j = 0; j < 7; ++j) {
  80.             sum_het += CSM[i][j];
  81.         }
  82.  
  83.         heti_csapadek[i] = sum_het;
  84.     }
  85.  
  86.     for (int i = 0; i < N; ++i) {
  87.         cout << heti_csapadek[i] << " ";
  88.     }
  89.     cout << endl;
  90.  
  91.     int max_csapadek_idx = 0;// TFH nincs csapadékosabb hét az elsőnél
  92.     for (int i = 1; i < N; ++i)// Max. hely keresés
  93.     {
  94.         if (heti_csapadek[i] > heti_csapadek[max_csapadek_idx])
  95.             max_csapadek_idx = i;
  96.     }
  97.  
  98.     cout << max_csapadek_idx + 1 << endl;
  99.  
  100.     int darab = 0;// Növekvő hetek megszámolása
  101.     for (int i = 0; i < N; ++i) {
  102.         if (novekvo_hetek[i] == true)
  103.             darab++;
  104.     }
  105.  
  106.     cout << darab << " ";
  107.  
  108.     for (int i = 0; i < N; ++i) {
  109.         if (novekvo_hetek[i] == true)
  110.             cout << i + 1 << " ";
  111.     }
  112.  
  113.     cout << endl;
  114.  
  115.     int max_csapadek_mentes_darab = 0;// A legtöbb csapadékmentes nap darabszáma az eddig legjobb 2 hetes periódusban
  116.     int max_csapadek_mentes_darab_index;// Ezen periódus első hetének indexe
  117.  
  118.     for (int i = 0; i < N - 1; ++i) {
  119.         int nulla_darab = 0;
  120.         for (int j = 0; j < 7; ++j) {// Napok viszgálata az aktuális és a következő hétre
  121.             if (CSM[i][j] == 0)
  122.                 nulla_darab++;
  123.             if (CSM[i + 1][j] == 0)
  124.                 nulla_darab++;
  125.         }
  126.  
  127.         if (nulla_darab > max_csapadek_mentes_darab) {
  128.             max_csapadek_mentes_darab = nulla_darab;
  129.             max_csapadek_mentes_darab_index = i;
  130.         }
  131.     }
  132.  
  133.     cout << max_csapadek_mentes_darab_index + 1  << endl;
  134.  
  135.     int kezdet = -1;// Leghosszabb alacsony csapadékú sorozat kezdete. -1 Jelzi, hogy még nem volt ilyen sorozat
  136.     int veg = -1;// vége
  137.     int act_kezdet = -1, act_veg;// Aktuális sorozat kezdete és vége. -1 jelzi, hogy nincs megkezdett sorozat
  138.  
  139.     for (int i = 0; i < N; ++i)
  140.     {
  141.  
  142.         if (heti_csapadek[i] <= 10) {
  143.             if (act_kezdet == -1)// Új sorozatot kezdünk, ha nem voltunk benne
  144.                 act_kezdet = i;
  145.         }
  146.         else if (act_kezdet != -1) {// Sok a csapadék, ha sorozatban voltunk, lezárjuk
  147.             act_veg = i - 1;
  148.             if (act_veg - act_kezdet > veg - kezdet || kezdet == -1) {// Ha hosszabb ez a sor, mint az eddigi leghosszabb VAGY nem volt még korábbi mentett sorozat, akkor elmentjük
  149.                 veg = act_veg;
  150.                 kezdet = act_kezdet;
  151.             }
  152.             act_kezdet = -1;
  153.         }
  154.     }
  155.  
  156.     if (act_kezdet != -1) {// Sorozatban voltunk az utolsó héten, lezárjuk
  157.         act_veg = N - 1;
  158.         if (act_veg - act_kezdet > veg - kezdet || kezdet == -1) {
  159.             veg = act_veg;
  160.             kezdet = act_kezdet;
  161.         }
  162.     }
  163.  
  164.     cout << kezdet + 1 << " " << veg + 1 << endl;
  165.  
  166.     return 0;
  167. }
Advertisement
RAW Paste Data Copied
Advertisement