- 题意:有 nnn 种手套,第 iii 种手套有 lil_ili 只左手套和 rir_iri 只右手套,现盲抽手套(抽取时无法分辨种类及左右),至少取多少只手套恰好取 kkk 种配对手套?
- 关键词:贪心(签到题)
- 题解:
- 本题需考虑答案的上界(即最坏情况)。
- 先考虑 111 种手套。对于无配对情形,通过每次抽取均为同侧即可满足,上界为 max(l,r)\max{(l,r)}max(l,r);对于配对情形,最坏为基于无配对情形的上界,再在另一侧(即 min(li,ri)\min{(l_i,r_i)}min(li,ri) 侧)取 111 只手套即可满足。
- 再推广到 nnn 种手套。对于 k=0k=0k=0 时,上界为 ∑i=1nmax(li,ri)\sum\limits_{i=1}^n\max{(l_i,r_i)}i=1∑nmax(li,ri);k=1k=1k=1 时,基于 k=0k=0k=0 的上界再在另一侧任取 111 只即可,而最坏即为任取的手套恰好为剩余手套中最多的那种;k=2k=2k=2 时,最坏需将 k=1k=1k=1 时任取的那种手套全部取完,再任取 111 只即可,上界即 (∑i=1nmax(li,ri))+max(min(li,ri))+1\Big(\sum\limits_{i=1}^n\max{(l_i,r_i)}\Big)+\max{(\min{(l_i,r_i)})}+1(i=1∑nmax(li,ri))+max(min(li,ri))+1;而 kkk 时上界则为将前 k−1k-1k−1 种全部取完,再任取 111 只即可。
- 实现:
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#define int ll
#define endl "\n"
void solve(){
int n,k;cin>>n>>k;
vector<int>l(n),r(n),minn(n);
for(auto &i:l) cin>>i;
for(auto &i:r) cin>>i;
int ans=0;
for(int i=0;i<n;i++){
ans+=max(l[i],r[i]);
minn[i]=min(l[i],r[i]);
}
sort(minn.begin(),minn.end(),greater<>());
for(int i=0;i<k-1;i++) ans+=minn[i];
cout<<ans+1<<endl;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0);
int t=1;cin>>t;
while(t--) solve();
return 0;
}