Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- bool check(int n, int k, int diff, int a[])
- {
- vector <bool> dp(n); // da li ucenik moze uzeti grupu za sebe
- // a da su svi ostali ispod njegove grupe dodjeljeni nekoj od grupa
- int last = -1;
- for(int i = k - 1; i < n; i++)
- {
- int low = 0, high = i - k + 1;
- while(low < high)
- {
- int pivot = (low + high) / 2;
- if(a[i] - a[pivot] > diff) low = pivot + 1;
- else high = pivot;
- }
- // low - najlaksi ucenik koji ispunjava kriterije da bude u grupi sa trenutnim
- // (udaljeni su minimalno k polja)
- if(a[i] - a[low] > diff) // trenutni ucenik nema dovoljno ljudi laksih od njega za formiranje grupe(manje od k - 1 laksih od njega)
- {
- continue;
- }
- if(low == 0) dp[i] = 1; // svi ucenici laksi od trenutnog mogu sa njim u grupu
- else if(dp[low - 1] || last > low - 1) dp[i] = 1; // najtezi ucenik koji ne moze sa trenutnim u grupu moze da pokrije sve lakse od sebe
- // ili postoji ucenik (last, a[last] > a[low]) koji moze da pokrije sve prije sebe
- // pri cemu trenutnom uceniku ostaje dovoljno ljudi za grupu[od (last + 1) do (i - 1)]
- if(dp[i - k + 1]) last = i - k + 1; // gledamo da li postoji novi ucenik koji pokriva sve ispred sebe i ostavlja dovoljno studenata za grupu sljedecem uceniku po tezini
- }
- return dp[n - 1]; // uslov: posljednji ucenik formira svoju grupu i svi ostali ucenici su dodjeljeni grupama pri cemu je diff maksimalna razlika tezina ucenika iz iste grupe
- }
- int main()
- {
- int n, k;
- cin >> n >> k;
- int a[n];
- for(int i = 0; i < n; i++)
- {
- cin >> a[i];
- }
- sort(a, a + n); // sortirati ucenike po rastucem redoslijedu njihovih tezina
- int low = 0, high = a[n - 1] - a[0];
- while(low < high)
- {
- int pivot = (low + high) / 2;
- if(check(n, k, pivot, a)) high = pivot; // ucenici se mogu rasporediti u grupe ne manje od k clanova
- // gdje je pivot najveca dozvoljena razlika tezina unutar jedne grupe
- else low = pivot + 1;
- }
- cout << low << endl; // najniza moguca razlika tezina
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement