Basecamp
    Ana Səhifə
    Problemlər
    Müsabiqələr
    Kurslar
    Reytinq
    Postlar
    Mağaza
    Discord
Tədris Raundu 2
Daxil ol
Tutorial•2 gün öncə

Tədris Raundu 2

Eolymp #8358. Orta dəyər - 1

“Məktəb Şagirdinin Orta Çəki­si” layihəsini Məmməd və Səməd həyata keçiriblər.

Onlara bu ədədin niyə lazım olduğu hələ də müəmmadır. Onlar məktəbdəki bütün şagirdlərdən çəkiyə çıxmalarını xahiş etdilər və nəticələri cədvələ yazdılar. Sənin vəzifən onlara şagirdlərin orta çəkisini hesablamaqda kömək etməkdir. Lakin bir şərt var: orta hesablanarkən ən yüksək və ən aşağı çəkiyə malik şagirdlər nəzərə alınmamalıdır.

Qeyd edək ki, Məmməd və Səməd ümumi şagird sayını saymağı unudublar, lakin bu, tapşırığı yerinə yetirməyə mane olmayacaq.

Giriş. Şagirdlərin çəkiləri bir neçə sətir üzrə verilir və boşluqlarla (bir və daha çox) və ya sətirsonu simvolu ilə ayrılır. Giriş faylın sonuna qədər davam edir.

Çıxış. Ən yüksək və ən aşağı çəkiyə malik şagirdləri istisna etməklə, şagirdlərin orta çəkisini çap edin. Nəticə ən yaxın tam ədədə yuvarlaqlaşdırılmalıdır.

beginrow

Nümunə giriş
40   23 27
  59 68 23    84   27
53 46  
Nümunə çıxış
46
Məsələyə keçid
Həll

Massivdə ən kiçik min və ən böyük max elementləri tapın. Daha sonra ən kiçik və ya ən böyük dəyərlərə malik olanları istisna etməklə bütün şagirdlərin çəkilərinin cəmini hesablayın. Bu cəmi s, bu şagirdlərin sayını isə cnt kimi işarə edək.

Sonda şagirdlərin orta çəkisini s-i cnt-yə bölməklə hesablayın və nəticəni ən yaxın bütöv kiloqrama yuvarlaqlaşdırıb çap edin.

Alqoritmin reallaşdırılması

Massivi elan edin.

int w[1000];

Giriş məlumatlarını oxuyun. Daxil edilən ədədlərin sayı n dəyişənində saxlanılır.

n = 0;
while (scanf("%d", &w[n]) == 1) n++;

Massivdə ən kiçik element min və ən böyük element max tapın.

min = max = w[0];
for (i = 0; i < n; i++)
{
  if (w[i] > max) max = w[i];
  if (w[i] < min) min = w[i];
}

Ən yüksək və ən aşağı çəkilər istisna olunmaqla, cəmi s və şagirdlərin sayını cnt hesablayın.

s = cnt = 0;
for (i = 0; i < n; i++)
  if (w[i] != min && w[i] != max)
  {
    s = s + w[i];
    cnt++;
 }
C++
7 lines
107 bytes

Nəticəni ən yaxın bütöv kiloqrama yuvarlaqlaşdıraraq çap edin.

printf("%.0lf\n", 1.0 * s / cnt);

Alqoritmin reallaşdırılması — min_element, max_element

Massivi elan edin.

vector<int> w;

Giriş məlumatlarını oxuyun.

while (scanf("%d", &x) == 1)
  w.push_back(x);

Massivdə ən kiçik element min_el və ən böyük element max_el tapın.

min_el = *min_element(w.begin(), w.end());
max_el = *max_element(w.begin(), w.end());

Ən yüksək və ən aşağı çəkilər istisna olunmaqla çəki cəmini s və şagirdlərin sayını cnt hesablayın.

s = cnt = 0;
for (int x : w)
  if (x != min_el && x != max_el) 
  {
    s += x;
    cnt++;
  }
C++
7 lines
95 bytes

Nəticəni ən yaxın bütöv kiloqrama yuvarlaqlaşdıraraq çap edin.

printf("%.0lf\n", 1.0 * s / cnt);
Eolymp #10405. Teleportasiya

Fermer Conun ən az xoşladığı təsərrüfat işlərindən biri çoxlu inək peyinini daşımaqdır. Bu prosesi sadələşdirmək üçün o, möhtəşəm bir ixtira fikirləşir: peyin teleporta­tı! Traktorunun arxasında qoşqu ilə iki nöqtə arasında peyin daşımaq əvəzinə, peyin teleportunu istifadə edib onu bir yerdən başqa yerə anında köçürə bilər.

Fermer Conun təsərrüfatı tək, uzun, düz bir yol boyunca salınıb; buna görə təsərrüfatdakı istənilən yer sadəcə bu yol üzərindəki mövqeyi ilə təsvir oluna bilər (əslində ədədlər oxunda bir nöqtə kimi). Teleport iki ədədlə — x və y ilə — təsvir olunur; x mövqeyinə gətirilən peyin ani olaraq y mövqeyinə, yaxud əksinə, daşına bilər.

Fermer Con peyini a nöqtəsindən b nöqtəsinə daşımaq istəyir və bu prosesdə kömək edə biləcək bir teleport quraşdırıb (əlbəttə, kömək etməsə ondan istifadə etməyə bilər). Xahiş edirik, traktorla daşımalı olduğu minimal ümumi məsafəni müəyyənləşdirməyə kömək edin.

Giriş. Bir sətirdə dörd tam ədəd verilir: başlanğıc və son mövqeləri təsvir edən a və b, sonra isə teleportu təsvir edən x və y. Bütün mövqelər 0…100 aralığında tam ədədlərdir və bir-birindən mütləq fərqli olmaya bilər.

Çıxış. Traktorla daşımalı olduğu minimal məsafəni göstərən tək tam ədəd çap edin.

Misal. Bu nümunədə ən yaxşı strategiya peyini əvvəlcə 3 mövqeyindən 2 mövqeyinə daşımaq, sonra 2-dən 8-ə teleport etmək, sonda isə 8-dən 10-a daşımaqdır. Beləliklə, traktor tələb edən ümumi məsafə 1+2=3 olur.

beginrow

Nümunə giriş
3 10 8 2  
Nümunə çıxış
3
Məsələyə keçid
Həll

Fermer Conun peyini hərəkət etdirmək üçün aşağıdakı seçimləri var:

  • Birbaşa a-dan b-yə sürmək — məsafə ∣a−b∣;

  • Traktoru a-dan x-ə sürmək, x-dən y-ə teleport etmək və sonra yenidən traktoru y-dən b-yə sürmək. Traktorun qət etdiyi ümumi məsafə ∣a−x∣+∣b−y∣;

  • Traktoru a-dan y-ə sürmək, y-dən x-ə teleport etmək və sonra traktoru x-dən b-yə sürmək. Traktorun qət etdiyi ümumi məsafə ∣a−y∣+∣b−x∣;

Bu üç dəyərin ən kiçiyi cavab olacaq.

Nümunə

Verilən nümunədə ən yaxşı strategiya peyini 3 mövqeyindən 2 mövqeyinə daşımaq, onu 8 mövqeyinə teleport etmək və sonra 10 mövqeyinə daşımaqdır. Beləliklə, traktorun qət etdiyi məsafə 1+2=3 olur.

Alqoritmin reallaşdırılması

Giriş məlumatlarını oxuyun.

scanf("%d %d %d %d", &a, &b, &x, &y);

Cavabı tapın — üç dəyərin minimumunu hesablayın.

res = abs(a - b);
res = min(res, abs(a - x) + abs(b - y));
res = min(res, abs(a - y) + abs(b - x));

Cavabı çap edin.

printf("%d\n", res);
Eolymp #8362. Multiples

1 ilə n (daxil olmaqla) arasında elə bir ədəd tapın ki, onun sadə vuruqlara görə parçalanmasında (faktorizasiyasında) sadə vuruqların sayı maksimum olsun. Əgər belə ədədlər bir neçədirsə, ən böyüyünü çap edin.

Məsələn, n=7 üçün cavab 6-dır, çünki o, sadə vuruqlara parçalananda iki vuruqdan ibarətdir: 2 və 3.

Giriş. Bir tam ədəd n (1≤n≤231−1).

Çıxış. Tələb olunan ədədi çap edin.

beginrow

Nümunə giriş
7
Nümunə çıxış
6
Məsələyə keçid
Həll

n-i aşmayan ədədin mümkün qədər çox böləni olması üçün o, ən kiçik sadə ədədlərin hasil kimi təqdim olunmalıdır.

Məsələn, 2k şəklində ədədlərə baxaq. 2k≤n şərtini ödəyən ən böyük k-nı tapın. 2k-ın bölənlərinin sayı d(2k)=k+1-dir.

Daha sonra 2k−1⋅3 ədədini nəzərdən keçirək. Onun bölənlərinin sayı d(2k−1⋅3)=k⋅2-dir ki, bu da k+1-dən böyükdür.

Deməli:

  • Əgər 2k−1⋅3≤n-dirsə, axtarılan ədəd 2k−1⋅3-dür;

  • Əks halda cavab 2k-dır.

Sonda xüsusi halı nəzərə alın: n=1 olduqda cavab 1-dir.

Nümunə

Qoy n=100. 100-ü aşmayan 2-nin ən böyük qüvvəti 26=64-dür. 64 ədədinin bölənlərinin sayı d(64)=6+1=7-dir.

İndi 25⋅3=96 ədədinə baxaq. Onun bölənlərinin sayı:

d(96)=(5+1)∗(1+1)=6∗2=12

96 100-ü aşmadığı üçün, n=100 üçün axtarılan ədəd bu olacaq.

Alqoritmin reallaşdırılması

Girişdən n dəyərini oxuyun.

scanf("%d",&n);

Elə ən böyük p=2k tapın ki, p≤n olsun.

p = 1;
while (p * 2 <= n)
  p = p * 2;

Daha sonra p1=2k−1⋅3=p/2⋅3 hesablayın.

p1 = p / 2 * 3;

Nəticə res-i müəyyənləşdirin. Əgər n=1-dirsə, nəticə 1 olacaq.

if (p1 <= n) res = p1; else res = p;
if (n == 1) res = 1;

Cavabı çap edin.

printf("%d\n",res);
Eolymp #8304. Fun funksiyası

Funksiyanın dəyərini tapın

f(x,y)=⎩⎨⎧​0,f(x−1,y−2)+f(x−2,y−1)+2,f(x−2,y−2)+1,​x≤0 və ya y≤0x≤yx>y​

Giriş. İki tam ədəd x,y (0≤x,y≤50).

Çıxış. f(x,y) funksiyasının dəyərini çap edin.

Nümunə giriş 1
2 3
Nümunə çıxış 1
4
Nümunə giriş 2
34 12 
Nümunə çıxış 2
6
Məsələyə keçid
Həll

Memoizasiya ilə rekursiv funksiyanı reallaşdırın.

Alqoritmin reallaşdırılması

Funksiya dəyərlərini saxlamaq üçün ikiölçülü massiv təyin edin: dp[x][y]=f(x,y).

long long dp[51][51];

Memoizasiya ilə f rekursiv funksiyasını reallaşdırın.

long long f(int x, int y)
{
  if (x <= 0 || y <= 0) return 0;
  if (dp[x][y] != -1) return dp[x][y];
  if (x <= y) return dp[x][y] = f(x - 1, y - 2) + f(x - 2, y - 1) + 2;
  return dp[x][y] = f(x - 2, y - 2) + 1;
}
C++
7 lines
215 bytes

Proqramın əsas hissəsi. Giriş məlumatlarını oxuyun.

scanf("%d %d",&x,&y);

dp massivinin hüceyrələrini −1 dəyəri ilə ilkinləşdirin.

memset(dp,-1,sizeof(dp));

f(x,y) funksiyasını çağırın və onun dəyərini çap edin.

printf("%lld\n",f(x,y));
Eolymp #11602. İki Yallı (Round Dance)

Bir gün n nəfər (n cütdür) meydanda görüşdü və iki yallı qurdu. Elə üsulların sayını tapın ki, hər yallı dəqiq n/2 nəfərdən ibarət olsun. Hər bir şəxs bu iki yallıdan yalnız birinə aid olmalıdır.

Yallı — 1 və ya daha çox nəfərdən ibarət dairəvi rəqsdir. İki yallı ayırtedilməz (eyni) sayılır, əgər birincinin başlanğıc iştirakçısını seçməklə o birinə çevrilmək mümkündür. Məsələn, [1,3,4,2],[4,2,1,3] və [2,1,3,4] yallıları ayırtedilməzdir.

Giriş. Tək sətirdə bir cüt tam ədəd n (2≤n≤20).

Çıxış. İki yallı qurmağın üsullarının sayını çap edin. Cavabın 64-bit tam ədəd tipinə sığacağına zəmanət verilir.

Nümunələr. Məsələn, n=4 üçün üsulların sayı 3-dür:

  • bir yallı — [1,2], digəri — [3,4];

  • bir yallı — [2,4], digəri — [3,1];

  • bir yallı — [4,1], digəri — [3,2].

Nümunə giriş
4
Nümunə çıxış
3

hrefhttps://basecamp.eolymp.com/problems/11602Məsələyə keçid

Həll

Əvvəlcə birinci dairəvi rəqs üçün n/2 nəfəri seçməliyik. Bunu Cnn/2​ üsulla etmək olar. Bir dairədə insanların necə düzüləcəyinin sayını hesablayaq: birinci olacaq şəxsi fiksasiya edirik, bundan sonra qalan n/2−1 nəfər istənilən qaydada düzülə bilər, yəni (n/2−1)! üsulla. İki dairəvi rəqsin formalaşdırılma üsullarının sayı:

Cnn/2​⋅(n/2−1)!⋅(n/2−1)! / 2

Buradakı 2-yə bölmə (x,y) və (y,x) cütlərini ayırd etməmək üçün lazımdır. Məsələn, n=4 üçün bölünmələr ([1,2],[3,4]) və ([3,4],[1,2]) eyni sayılır.

Verilən formulu sadələşdirsək, cavabı alarıq:

(n/2)!⋅(n/2)!n!​⋅(n/2−1)!⋅(n/2−1)! / 2=21​⋅(n/2)⋅(n/2)n!​=n⋅n2⋅n!​=n2⋅(n−1)!​

Nümunə

Məsələn, n=4 üçün üsulların sayı 3-dür:

  • Bir yallı — [1,2], digəri — [3,4];

  • Bir yallı — [2,4], digəri — [3,1];

  • Bir yallı — [4,1], digəri — [3,2].

Formul üzrə n=4 üçün cavab

42⋅(4−1)!​=412​=3

Gəlin, n=4 üçün bütün ayırdedilən dairəvi rəqsləri quraq. İştirakçı 1-i birinci mövqedə yerləşdirək. Qalan üç mövqeyə digər üç iştirakçının istənilən yerləşməsini qoya bilərik.

Bu düzülüşlərin hər hansı birini çevirməklə eyni (ayırtedilməz) dairəvi rəqslər alınır. Məsələn, aşağıdakı düzülüşlər ayırtedilməzdir (son permutasiyanın siklik sürüşmələrini nəzərdən keçirin):

[1,4,3,2], [2,1,4,3], [3,2,1,4], [4,3,2,1]

4 iştirakçı ilə 4!=24 dairəvi rəqs var. Lakin n=4 üçün ayırdedilən dairəvi rəqslərin sayı 3!=6-dır.

Alqoritmin reallaşdırılması

fact funksiyası n ədədinin faktorialını hesablayır.

long long fact(int n)
{
  long long res = 1;
  for (int i = 2; i <= n; i++)
    res *= i;
  return res;
}
C++
7 lines
106 bytes

Proqramın əsas hissəsi. n dəyərini oxuyun.

scanf("%d", &n);

Nəticəni hesablayın və çap edin.

res = 2 * fact(n - 1) / n;
printf("%lld\n", res);
Eolymp #11455. K xüsusi xanalar

Sizə ölçüsü n×m olan və k xüsusi xanaya malik bir matrisa verilir. (1,1) mövqeyindən başlayıb (n,m) xanaya çatmalısınız. Hər hansı xananın içindən yalnız sağa və ya aşağı hərəkətə icazə verilir.

Bu k xüsusi xananın hər birinin müəyyən gücü var. i-ci xüsusi xananın gücü pi​-dir və əgər bu xananın üzərindən keçsəniz, həmin gücü qazanırsınız.

Tapşırığınız (1,1)-dən (n,m)-ə olan bütün mümkün yollar üzrə toplanacaq ümumi gücü tapmaqdır.

Qeyd:

  • Yolun gücü həmin yol boyunca ziyarət edilən bütün xüsusi xanaların pi​ dəyərlərinin cəmidir.

  • Xüsusi olmayan adi xanaların gücü sıfıra bərabərdir.

Giriş. Birinci sətirdə testlərin sayı olan t verilir.

Hər testin birinci sətirində üç tam ədəd n,m (1≤n,m≤105) və k (1≤k≤106) verilir; burada n×m şəbəkənin ölçüsü, k isə xüsusi xanaların sayıdır.

Sonrakı k sətirdə hər birində üç tam ədəd xi​,yi​ (1≤xi​≤n,1≤yi​≤m) və pi​ (1≤pi​≤105) verilir; burada (xi​,yi​) xüsusi xananın mövqeyi, pi​ isə onun gücüdür.

Çıxış. Hər test üçün ayrıca sətirdə toplanacaq ümumi gücü çap edin. Nəticə çox böyük ola biləcəyindən, onu 109+7 modulu üzrə verin.

beginrow

Nümunə giriş
1
2 2 2
1 2 4
2 1 7
Nümunə çıxış
11
Məsələyə keçid
Həll

ways(x,y) — (1,1) hüceyrəsindən (1+x,1+y) hüceyrəsinə qədər şəbəkə üzərində yolların sayını ifadə etsin. O zaman

ways(x,y)=Cx+yx​=Cx+yy​

(1,1) hüceyrəsindən (n,m) hüceyrəsinə gedən və xüsusi (x,y) hüceyrəsindən keçən yolların sayı ways(x−1,y−1)⋅ways(n−x,m−y)-ə bərabərdir. Bu ədədi p ilə vurmaq (x,y) hüceyrəsindən keçən bütün yolların ümumi gücünü verir.

Qalır, xüsusi hüceyrələrdən keçən bütün yolların güclərini toplamaq. Cavab aşağıdakı cəmlə veriləcək:

i=1∑k​ways(xi​−1,yi​−1)⋅ways(n−xi​,m−yi​)⋅pi​

Nümunə

Verilən nümunədə k=2 xüsusi xana göstərilib.

  • Gücü 4 olan xananın üzərindən dəqiq bir yol keçir.

  • Gücü 7 olan xananın üzərindən dəqiq bir yol keçir.

Beləliklə, ümumi güc 4+7=11-dir.

Alqoritmin reallaşdırılması

Massivləri təyin edin:

  • fact — ədədlərin faktoriallarının MOD üzrə qalıqları,

  • factinv — bu faktorialların MOD üzrə tərs elementləri:

fact[n]=n!mod1000000007factinv[n]=(n!)−1mod1000000007
#define MAX 800001
ll fact[MAX], factinv[MAX];

pow funksiyası p modulu üzrə qüvvəti hesablayır: xnmodp.

ll pow(ll x, ll n, ll p)
{
    if (n == 0) return 1;
    if (n % 2 == 0) return pow((x * x) % p, n / 2, p);
    return (x * pow(x, n - 1, p)) % p;
}

inverse funksiyası p sadə moduluna görə x ədədinin modul üzrə tərsini tapır. p sadə olduğundan, Fermatın kiçik teoreminə görə:

xp−1modp=1istənilən 1≤x<p u¨c¸​u¨n

Bunu (x⋅xp−2)modp=1 kimi yazmaq olar, buradan x-in modul üzrə tərsinin xp−2modp olduğu nəticəsi çıxır.

ll inverse(ll x, ll p)
{
  return pow(x, p - 2, p);
}

Cnk funksiyası binom əmsalını aşağıdakı düsturla hesablayır:

Cnk​=k!(n−k)!n!​
ll Cnk(int n, int k)
{
  return ((fact[n] * factinv[k]) % MOD * factinv[n - k]) % MOD;
}

ways funksiyası (0,0) hüceyrəsindən (n,m) hüceyrəsinə qədər n×m şəbəkəsində yolların sayını hesablayır. Bu nöqtələr arasındakı istənilən yolun uzunluğu n+m-dir və dəqiq olaraq m üfüqi addım ehtiva etdiyindən, yolların sayı Cn+mm​-ə bərabərdir.

ll ways(int n, int m)
{
  return Cnk(n + m, m);
}

Proqramın əsas hissəsi. Faktoriallar fact və tərs faktoriallar factinv massivlərini doldurun.

fact[0] = 1;
for (i = 1; i < MAX; i++)
  fact[i] = (fact[i - 1] * i) % MOD;

factinv[0] = 1;
for (i = 1; i < MAX; i++)
  factinv[i] = inverse(fact[i], MOD);
C++
7 lines
157 bytes

Testləri ardıcıl emal edin.

scanf("%d", &tests);
while (tests--)
{

Cari test üçün məlumatları oxuyun.

  scanf("%d %d %d", &n, &m, &k);

Alınan ümumi gücü res dəyişənində saxlayın.

  res = 0;

k xüsusi xananı emal edin.

  for (i = 0; i < k; i++)
  {
    scanf("%d %d %d", &x, &y, &p);
    res = (res + (ways(x - 1, y - 1) * 
                  ways(n - x, m - y)) % MOD * p) % MOD;
  }

Cari test üçün cavabı çap edin.

  printf("%lld\n", res);
}

2

Şərhlər

Yüklənir

Bir an, serverdən məlumat alınır

Hələ də heç nə

Söhbəti başladan ilk siz olun!
Daxil ol