

Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
`***` $\texttt{Tóm tắt đề:}$
`@` n hộp quà/giá trị `a[i]`
`@` Chọn k lớn nhất thỏa mãn:
`-` Hộp `1` từ `1` `->` `k`
`-` Hộp `2` từ `K``+``1` `->` `n`
`-` mỗi giỏ gồm 2 hộp
`-` giá trị hộp 1 `<` hộp 2
`->`ghép mỗi phần tử bên trái với một phần tử bên phải lớn hơn nó / Ghép đc `k` cặp `->` k hợp lệ
`***` $\texttt{Idea: }$
`@` Kiểm tra `k` có hợp lệ hay k:
`-` chia mảng:
`+` L = a[1 `->` k]
`+` R = a[k+1 `->` n]
`@` sort L, R
`@` for 2 con trỏ:
`-` i trong L
`-` j trong R
`+` if L[i] < R[j] `->` ghép được → i++, j++, cnt++
else j++
`@`
cnt `>=` K `->` K hợp lệ
cnt `<` K `->` K không hợp lệ
`->` kq là K lớn nhất trong tập hợp các K hợp lệ
$\texttt{C++}$
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[100005];
bool ok(int k){
vector<int> l,r;
for(int i=1;i<=k;i++) l.push_back(a[i]);
for(int i=k+1;i<=n;i++) r.push_back(a[i]);
sort(l.begin(),l.end());
sort(r.begin(),r.end());
int i=0,j=0,c=0;
while(i<l.size() && j<r.size()){
if(l[i]<r[j]){
c++;
i++;
j++;
}else j++;
}
return c>=k;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
int l=1,r=n/2,ans=-1;
while(l<=r){
int mid=(l+r)/2;
if(ok(mid)){
ans=mid;
l=mid+1;
}else r=mid-1;
}
cout<<ans;
}
Hãy giúp mọi người biết câu trả lời này thế nào?
Bảng tin