10-11 класс
Массивтің $(i, j)$ $1 \le i < j \le n$ индекстері арқылы $a_i$, $a_j$ жұбын ала аламыз және ол жұптың күші $a_i + a_j$ болады. Берілген массивтегі алуға болатын жұптардың барлығын күші бойынша \textbf{кемімейтін} ретпен сұрыптаған кездегі $k$-шы орындағы жұптың күшінің мәнін табыңыз.
Кіріс деректер форматы:
Бірінші қатарда екі $n$ және $k$ ($1 \le k \le \frac{n * (n - 1)}{2}$) сандары берілген.Екінші қатарда бос орын арқылы $a_1$, $a_2$, ..., $a_n$ ($0 \le a_i \le 10^6$) бүтін сандары берілген.
Шығыс деректер форматы:
Есептің жауабын шығарыңыз.Мысалдар:
1.Мысал:3 3 7 1 4Жауап:
112.Мысал:
5 7 1 5 3 5 3Жауап:
83.Мысал:
10 32 0 0 0 0 0 0 0 0 0 0Жауап:
04.Мысал:
9 15 5 6 3 0 0 4 1 4 1Жауап:
5
Түсініктеме:
Бірінші мысалда күштері {$a_1$ + $a_2$, $a_1$ + $a_3$, $a_2$ + $a_3$} = {7 + 1, 7 + 4, 1 + 4} = {8, 11, 5} болатын үш жұп алуға болады. Егер оларды күші бойынша кемімейтін ретпен сұрыптасақ, онда олар {5, 8, 11} ретпен тұрады және осындағы 3-шісі 11-ге тең.Екінші мысалда күштері {$a_1$ + $a_2$, $a_1$ + $a_3$, $a_1$ + $a_4$, $a_1$ + $a_5$, $a_2$ + $a_3$, $a_2$ + $a_4$, $a_2$ + $a_5$, $a_3$ + $a_4$, $a_3$ + $a_5$, $a_4$ + $a_5$} = {1 + 5, 1 + 3, 1 + 5, 1 + 3, 5 + 3, 5 + 5, 5 + 3, 3 + 5, 3 + 3, 5 + 3} = {6, 4, 6, 4, 8, 10, 8, 8, 6, 8} болатын он жұп алуға болады. Егер оларды күші бойынша кемімейтін ретпен сұрыптасақ, онда олар {4, 4, 6, 6, 6, 8, 8, 8, 8, 10} ретпен тұрады және осындағы 7-шісі 8-ге тең.
Бағалау:
Есеп 50 тесттен тұрады, әр тест 2 ұпаіға бағаланады.Тесттердегі шектеулер:
- 10 тестте: $2 \le n \le 10^3$
- 20 тестте: $2 \le n \le 10^4$
- 20 тестте: $2 \le n \le 10^5$
Комментарий/решение:
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, k;
cin >> n >> k;
int a[n];
vector<int> b;
for(int i = 0; i<n; i++){
cin >> a[i];
}
for(int i = 0; i<n-1; i++){
for(int j = i+1; j<n; j++){
b.push_back(a[i]+a[j]);
}
}
sort(b.begin(), b.end());
cout << b[k-1];
}
#include <bits/stdc++.h>
#define ll long long
#define f first
#define s second
#define mp make_pair
#define pb push_back
using namespace std;
const ll inf = 1e9 + 123;
const ll N = 1e5 + 123;
const ll mod = 1e9 + 7;
ll n,k,a[N];
ll get(int x){
ll cnt = 0;
for(int j = 1; j <= n; ++j){
int l = 1, r = j - 1, ind = 0;
while(l <= r){
int mid = (l + r) / 2;
if(a[mid] + a[j] <= x){
ind = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
cnt += ind;
}
return cnt;
}
int main() {
cin >> n >> k;
for(int i = 1; i <= n; ++i){
cin >> a[i];
}
sort(a + 1, a + n + 1);
ll l = 0, r = 2000000, ans;
while(l <= r){
ll mid = (l + r) / 2;
if(get(mid) >= k){
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
cout << ans;
}
Не знаю разрешены ли библиотеки, но эта встроенная
Возможно, что при неправильном наборе формул, они будут
доредактированы модератором. При этом содержание не будет меняться.