Bunyodning N nafar do'stidan 3 tasi ovqati bor ekan, demak qolgan N-3 ta uchun ovqat kerak.
Biz sonning raqamlarini o'rnini almashtirib boshqa son hosil qilolmaymiz qachonki barcha raqamlar teng bo'lsa, demak agar barcha raqamlar teng bo'lsa javob NO aks holda YES.
Askarni omadli hisoblaymiz agar kiritilgan sonlar ichida birontasi 42 bo'lgandagi qoldiq askarning raqamiga teng bo'lsa. Kiritiladigan sonlar ichida 42 ga bo'lgandagi qoldiq har hil bo'ladigan nechi hil son borligini topsak bo'ldi. Buni set yoki oddiy bool array bilan sanasa bo'ladi.
Loading…..
Bu masalaga dynamic programming orqali yechiladi. Keling dp[n] deb n sonini hosil qilish uchun minimal nechta 1 ketishini belgilab olamiz. Boshida dp[0] = 0. Endi qolgan sonlar uchun dp'ni hisoblaymiz. Hozirgi dp'sini hisoblayotgan sonimizni m deb olaylik. m sonini hosil qilish uchun 2 ta optimal usul bor:
1) dp[m] = dp[k] + (m - k) va bu yerda 0 <= k < m.
2) dp[m] = dp[x] + dp[y] va bu yerda 1 <= x, y <= m va x*y = m. Bu yerda biz x sonini y soniga ko'paytirib m sonini hosil qilayabmiz. Tepadagi shartni qanoatlantiradigan har bir (x, y) juftlik bilan dp[m] ni minimallashtiramiz.
C++ dasturlash tilida masalalar yechimlari:
#include "bits/stdc++.h"
using namespace std;
int main() {
int n;
cin >> n;
cout << n - 3;
return 0;
}
#include "bits/stdc++.h"
using namespace std;
int main() {
string s;
cin >> s;
sort(s.begin(), s.end());
// agar eng katta element bilan eng kichik element teng bo'lsa demak hamma elementlar teng
cout << (s[0] == s.back() ? "NO" : "YES");
return 0;
}
#include "bits/stdc++.h"
using namespace std;
int main() {
// 1-usul
vector<bool> vis(42);
for (int i = 0; i < 10; i++) {
int x;
cin >> x;
// bu "coca-cola" x % 42 nomerli askarga tegadi
vis[x % 42] = true;
}
cout << count(vis.begin(), vis.end(), true);
// 2-usul
// set<int> st;
// for (int i = 0; i < 10; i++) {
// int x;
// cin >> x;
// st.insert(x % 42);
// }
// cout << st.size();
return 0;
}
#include<iostream>
using namespace std;
int main() {
cout << "Loading...";
}
#include "bits/stdc++.h"
using namespace std;
const int inf = 1e9;
int main() {
int n;
cin >> n;
vector<int> dp(n + 1, inf);
dp[0] = 0;
for (int i = 1; i <= n; i++) {
// shunchaki hammasi +1
dp[i] = i;
for (int j = 1; j < i; j++) {
dp[i] = min(dp[i], dp[j] + (i - j));
if (i % j == 0) {
dp[i] = min(dp[i], dp[j] + dp[i / j]);
}
}
}
cout << dp[n];
return 0;
}
Python dasturlash tilidagi yechimlar:
n = int(input())
print(n - 3)
s = input()
s = sorted(s)
# agar eng katta element bilan eng kichik element teng bo'lsa demak hamma elementlar teng
print("NO" if s[0] == s[-1] else "YES")
# 1-usul
vis = [False] * 42
for i in range(10):
x = int(input())
vis[x % 42] = True
print(vis.count(True))
# 2-usul
# st = set()
# for i in range(10):
# x = int(input())
# st.add(x % 42)
# print(len(st))
print('Loading...')
inf = 1e9
n = int(input())
dp = [inf] * (n + 1)
dp[0] = 0
for i in range(1, n + 1):
# shunchaki hammasi +1
dp[i] = i
for j in range(1, i):
dp[i] = min(dp[i], dp[j] + (i - j))
if i % j == 0:
dp[i] = min(dp[i], dp[j] + dp[i // j])
print(dp[n])