[题解]CF2096B-Wonderful Gloves

  • 题意:有 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=1nmax(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=1nmax(li,ri))+max(min(li,ri))+1;而 kkk 时上界则为将前 k−1k-1k1 种全部取完,再任取 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];//k-1种全部取完
    cout<<ans+1<<endl;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0);
    int t=1;cin>>t;
    while(t--) solve();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值