Tədris Raundu 2
Massivdə ən kiçik və ən böyük 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 , bu şagirdlərin sayını isə kimi işarə edək.
Sonda şagirdlərin orta çəkisini -i -yə bölməklə hesablayın və nəticəni ən yaxın bütöv kiloqrama yuvarlaqlaşdırıb çap edin.
Massivi elan edin.
int w[1000];
Giriş məlumatlarını oxuyun. Daxil edilən ədədlərin sayı dəyişənində saxlanılır.
n = 0; while (scanf("%d", &w[n]) == 1) n++;
Massivdə ən kiçik element və ən böyük element 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 və şagirdlərin sayını hesablayın.
s = cnt = 0; for (i = 0; i < n; i++) if (w[i] != min && w[i] != max) { s = s + w[i]; cnt++; }
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 və ən böyük element 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 və şagirdlərin sayını hesablayın.
s = cnt = 0; for (int x : w) if (x != min_el && x != max_el) { s += x; cnt++; }
Nəticəni ən yaxın bütöv kiloqrama yuvarlaqlaşdıraraq çap edin.
printf("%.0lf\n", 1.0 * s / cnt);
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 teleportatı! 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ə — və ilə — təsvir olunur; mövqeyinə gətirilən peyin ani olaraq mövqeyinə, yaxud əksinə, daşına bilər.
Fermer Con peyini nöqtəsindən 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 və , sonra isə teleportu təsvir edən və . Bütün mövqelər 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ə mövqeyindən mövqeyinə daşımaq, sonra -dən -ə teleport etmək, sonda isə -dən -a daşımaqdır. Beləliklə, traktor tələb edən ümumi məsafə olur.

beginrow
3 10 8 2
3
Fermer Conun peyini hərəkət etdirmək üçün aşağıdakı seçimləri var:
Birbaşa -dan -yə sürmək — məsafə ;
Traktoru -dan -ə sürmək, -dən -ə teleport etmək və sonra yenidən traktoru -dən -yə sürmək. Traktorun qət etdiyi ümumi məsafə ;
Traktoru -dan -ə sürmək, -dən -ə teleport etmək və sonra traktoru -dən -yə sürmək. Traktorun qət etdiyi ümumi məsafə ;
Bu üç dəyərin ən kiçiyi cavab olacaq.
Nümunə
Verilən nümunədə ən yaxşı strategiya peyini mövqeyindən mövqeyinə daşımaq, onu mövqeyinə teleport etmək və sonra mövqeyinə daşımaqdır. Beləliklə, traktorun qət etdiyi məsafə olur.
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);
ilə (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 cavab -dır, çünki o, sadə vuruqlara parçalananda iki vuruqdan ibarətdir: və .
Giriş. Bir tam ədəd .
Çıxış. Tələb olunan ədədi çap edin.
beginrow
7
6
-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, şəklində ədədlərə baxaq. şərtini ödəyən ən böyük -nı tapın. -ın bölənlərinin sayı -dir.
Daha sonra ədədini nəzərdən keçirək. Onun bölənlərinin sayı -dir ki, bu da -dən böyükdür.
Deməli:
Əgər -dirsə, axtarılan ədəd -dür;
Əks halda cavab -dır.
Sonda xüsusi halı nəzərə alın: olduqda cavab -dir.
Nümunə
Qoy . -ü aşmayan -nin ən böyük qüvvəti -dür. ədədinin bölənlərinin sayı -dir.
İndi ədədinə baxaq. Onun bölənlərinin sayı:
-ü aşmadığı üçün, üçün axtarılan ədəd bu olacaq.
Girişdən dəyərini oxuyun.
scanf("%d",&n);
Elə ən böyük tapın ki, olsun.
p = 1; while (p * 2 <= n) p = p * 2;
Daha sonra hesablayın.
p1 = p / 2 * 3;
Nəticə -i müəyyənləşdirin. Əgər -dirsə, nəticə olacaq.
if (p1 <= n) res = p1; else res = p; if (n == 1) res = 1;
Cavabı çap edin.
printf("%d\n",res);
Funksiyanın dəyərini tapın
Giriş. İki tam ədəd .
Çıxış. funksiyasının dəyərini çap edin.
2 3
4
34 12
6
Memoizasiya ilə rekursiv funksiyanı reallaşdırın.
Funksiya dəyərlərini saxlamaq üçün ikiölçülü massiv təyin edin: .
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; }
Proqramın əsas hissəsi. Giriş məlumatlarını oxuyun.
scanf("%d %d",&x,&y);
massivinin hüceyrələrini dəyəri ilə ilkinləşdirin.
memset(dp,-1,sizeof(dp));
funksiyasını çağırın və onun dəyərini çap edin.
printf("%lld\n",f(x,y));
Bir gün nəfər ( 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əfərdən ibarət olsun. Hər bir şəxs bu iki yallıdan yalnız birinə aid olmalıdır.
Yallı — 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, və yallıları ayırtedilməzdir.
Giriş. Tək sətirdə bir cüt tam ədəd .
Çıxış. İki yallı qurmağın üsullarının sayını çap edin. Cavabın -bit tam ədəd tipinə sığacağına zəmanət verilir.
Nümunələr. Məsələn, üçün üsulların sayı -dür:
bir yallı — , digəri — ;
bir yallı — , digəri — ;
bir yallı — , digəri — .
4
3
hrefhttps://basecamp.eolymp.com/problems/11602Məsələyə keçid
Əvvəlcə birinci dairəvi rəqs üçün nəfəri seçməliyik. Bunu ü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əfər istənilən qaydada düzülə bilər, yəni üsulla. İki dairəvi rəqsin formalaşdırılma üsullarının sayı:
Buradakı -yə bölmə və cütlərini ayırd etməmək üçün lazımdır. Məsələn, üçün bölünmələr və eyni sayılır.
Verilən formulu sadələşdirsək, cavabı alarıq:
Nümunə
Məsələn, üçün üsulların sayı -dür:
Bir yallı — , digəri — ;
Bir yallı — , digəri — ;
Bir yallı — , digəri — .
Formul üzrə üçün cavab
Gəlin, üçün bütün ayırdedilən dairəvi rəqsləri quraq. İştirakçı -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):
iştirakçı ilə dairəvi rəqs var. Lakin üçün ayırdedilən dairəvi rəqslərin sayı -dır.
fact funksiyası ə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; }
Proqramın əsas hissəsi. 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);
Sizə ölçüsü olan və xüsusi xanaya malik bir matrisa verilir. mövqeyindən başlayıb 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 xüsusi xananın hər birinin müəyyən gücü var. -ci xüsusi xananın gücü -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 -dən -ə 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 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 verilir.
Hər testin birinci sətirində üç tam ədəd və verilir; burada şəbəkənin ölçüsü, isə xüsusi xanaların sayıdır.
Sonrakı sətirdə hər birində üç tam ədəd və verilir; burada xüsusi xananın mövqeyi, 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 modulu üzrə verin.
beginrow
1 2 2 2 1 2 4 2 1 7
11
— hüceyrəsindən hüceyrəsinə qədər şəbəkə üzərində yolların sayını ifadə etsin. O zaman
hüceyrəsindən hüceyrəsinə gedən və xüsusi hüceyrəsindən keçən yolların sayı -ə bərabərdir. Bu ədədi ilə vurmaq 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:
Nümunə
Verilən nümunədə xüsusi xana göstərilib.
Gücü olan xananın üzərindən dəqiq bir yol keçir.
Gücü olan xananın üzərindən dəqiq bir yol keçir.
Beləliklə, ümumi güc -dir.
Massivləri təyin edin:
— ədədlərin faktoriallarının üzrə qalıqları,
— bu faktorialların üzrə tərs elementləri:
#define MAX 800001 ll fact[MAX], factinv[MAX];
pow funksiyası modulu üzrə qüvvəti hesablayır: .
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ı sadə moduluna görə ədədinin modul üzrə tərsini tapır. sadə olduğundan, Fermatın kiçik teoreminə görə:
Bunu kimi yazmaq olar, buradan -in modul üzrə tərsinin 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:
ll Cnk(int n, int k) { return ((fact[n] * factinv[k]) % MOD * factinv[n - k]) % MOD; }
ways funksiyası hüceyrəsindən hüceyrəsinə qədər şəbəkəsində yolların sayını hesablayır. Bu nöqtələr arasındakı istənilən yolun uzunluğu -dir və dəqiq olaraq üfüqi addım ehtiva etdiyindən, yolların sayı -ə bərabərdir.
ll ways(int n, int m) { return Cnk(n + m, m); }
Proqramın əsas hissəsi. Faktoriallar və tərs faktoriallar 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);
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ü dəyişənində saxlayın.
res = 0;
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); }