Advertisement
Guest User

näidislahendused

a guest
Mar 22nd, 2021
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <iomanip>
  4.  
  5. using namespace std;
  6.  
  7. /* Ülesanne:
  8.  * On antud kasvav funktsioon f (antud juhul f(x) = x ln (x))
  9.  * ja reaalarv c.
  10.  *
  11.  * Lahenda võrrand f(x) = c. Leitud lahend tohib olla ülimalt
  12.  * 10^{-6} võrra erinev tegelikust lahendist.
  13.  */
  14.  
  15. double f (double x) {
  16.   return x * log(x);
  17. }
  18.  
  19. const double EPS = 1e-6;
  20.  
  21. // Lahendab võrrandi f(x) = c eeldusel, et lahend asub lõigus [lo, hi]
  22. double solve (double lo, double hi, double c) {
  23.   double mid = (lo + hi) / 2;
  24.   if (hi - lo < EPS) {
  25.     return mid;
  26.   }
  27.  
  28.   if (f(mid) < c) {
  29.     // siis teame, et lahend asub kuskil lõigus [mid, hi]
  30.     return solve(mid, hi, c);
  31.   } else {
  32.     // teame, et lahend asub kuskil lõigus [lo, mid]
  33.     return solve(lo, mid, c);
  34.   }
  35. }
  36.  
  37. double solve (double c) {
  38.   return solve(1, 1e9, c);
  39. }
  40.  
  41. int main () {
  42.   double c;
  43.   cin >> c;
  44.  
  45.   cout << fixed
  46.        << setprecision(15)
  47.        << solve(c) << endl;
  48. }
  49.  
  50. /* ================================ */
  51.  
  52. #include <iostream>
  53. #include <vector>
  54.  
  55. using namespace std;
  56.  
  57. /* Ülesanne:
  58.  * Kostja kolib Itaaliasse ja pakib rutakalt asju kastidesse. Kuna tal on
  59.  * sellega kiire ja ta on ka üksjagu laisk, siis võtab ta asju sellises järjekorras,
  60.  * nagu kätte juhtub, ja asetab neid järjest kastidesse – kõigepealt ainult esimesse
  61.  * kasti, seejärel ainult teise jne. Kirjuta programm, mis aitab Kostjal valida
  62.  * väikseima võimaliku kasti suuruse, nii et kõik ta M asja mahuksid tema
  63.  * pakkumismeetodi juures ära maksimaalselt N kasti.
  64.  *
  65.  * 1 <= N <= 1e5, 1 <= M <= 1e6, kõikide asjade suurused vahemikus 1...1000
  66.  *
  67.  * Näide:
  68.  * N = 3, M = 6
  69.  * asjad = [2, 16, 3, 7, 10, 12]
  70.  *
  71.  * Vastus:
  72.  * 20 (esimesse kasti 1 ja 2; teise 3, 4, 5; kolmandasse 6. ese.
  73.  */
  74.  
  75. // Kas n kasti, igaüks suurusega box_size, mahuvad kõik vektori arr elemendid
  76. bool can_fit (int box_size, int n, const vector<int> &arr) {
  77.   int boxes_left = n, current_remaining = box_size;
  78.   for (int u : arr) {
  79.     if (box_size < u) {
  80.       return false;
  81.     }
  82.    
  83.     if (current_remaining < u) {
  84.       boxes_left--;
  85.       if (boxes_left == 0) {
  86.     return false;
  87.       }
  88.       current_remaining = box_size;
  89.     }
  90.  
  91.     current_remaining -= u;
  92.   }
  93.  
  94.   return true;
  95. }
  96.  
  97. int solve (int lo, int hi, int n, const vector<int> &arr) {
  98.   if (lo == hi) {
  99.     return lo;
  100.   }
  101.  
  102.   int mid = (lo + hi) / 2;
  103.   if (!can_fit(mid, n, arr)) {
  104.     return solve(mid + 1, hi, n, arr);
  105.   } else {
  106.     return solve(lo, mid, n, arr);
  107.   }
  108. }
  109.  
  110. int solve (int n, const vector<int> &arr) {
  111.   return solve(1, 1e9, n, arr);
  112. }
  113.  
  114. int main () {
  115.   ios::sync_with_stdio(false);
  116.  
  117.   int n, m;
  118.   cin >> n >> m;
  119.  
  120.   vector<int> arr (m);
  121.   for (int i = 0; i < m; i++) {
  122.     cin >> arr[i];
  123.   }
  124.  
  125.   cout << solve(n, arr) << '\n';
  126. }
  127.  
  128. /* ========================================= */
  129.  
  130. #include <iostream>
  131. #include <cmath>
  132.  
  133. using namespace std;
  134.  
  135. /* Ülesanne:
  136.  * On antud reaalmuutuja funktsioon f, mis on unimodaalne:
  137.  * kuni mingi punktini kahanev ja sealt punktist edasi kasvav
  138.  * Leia funktsiooni f haripunkt (x, kus f(x) on minimaalne).
  139.  * Meie näites f(x) = x^4 - 2x^3 - x.
  140.  *
  141.  * Leitud lahend peab olema ülimalt 1e-6 kaugusel tegelikust lahendist.
  142.  */
  143.  
  144. double f (double x) {
  145.   return pow(x, 4) - 2 * pow(x, 3) - x;
  146. }
  147.  
  148. const double EPS = 1e-6;
  149.  
  150. double solve (double lo, double hi) {
  151.   if (hi - lo < EPS) {
  152.     return (lo + hi) / 2;
  153.   }
  154.  
  155.   double m1 = lo + (hi - lo) / 3;
  156.   double m2 = hi - (hi - lo) / 3;
  157.  
  158.   if (f(m1) < f(m2)) {
  159.     return solve(lo, m2);
  160.   } else {
  161.     return solve(m1, hi);
  162.   }
  163. }
  164.  
  165. double solve () {
  166.   return solve(-2, 2);
  167. }
  168.  
  169. int main () {
  170.   cout << solve() << endl;
  171. }
  172.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement