【题解】扑克牌游戏

【题解】扑克牌游戏

假如我们知道一个答案,那么我们剩下的问题就是去检查这个答案是否合法。

显然可以拿\(m\)做文章,假设我们最终可以得到\(ans\)组套牌,那么对于每张牌,如果它的数量比\(ans\)小,我们就需要拿\(joker\)补。多的就没关系了。

很棒的思路,还有一个贪心做法,也很神仙。orz

#include<bits/stdc++.h>
#define R register int
#define gc getchar
using namespace std;
typedef long long ll;
#define RP(t,a,b) for(register ll t(a),edd(b);t<=edd;t++)
#define DRP(t,a,b) for(register ll t(a),edd(b);t>=edd;t--)
int qr(ll x){
    ll ans=0,flag=1;
    char ch=gc();
    while((ch>'9'||ch<'0')&&ch!='-')ch=gc();
    if(ch=='-')flag=-1,ch=gc();
    while(ch>='0'&&ch<='9')ans=ans*10ll+ch-48ll,ch=gc();
    return ans*flag;
}

int psj_ak_ioi=2020;
const int maxn=101;
ll data[maxn];
ll n,m;
inline bool chek(ll x){
    ll ret=0;
    RP(t,1,n) if(data[t]<x) ret+=x-data[t];
    return ret<=m&&ret<=x;
}

int main(){
    n=qr(1ll);m=qr(1ll);
    RP(t,1,n) data[t]=qr(1ll);
    int l=0,r=(ll)500000005+m;
    do{
        register ll mid=(l+r)>>1;
        if(chek(mid)) l=mid+1;
        else r=mid-1;
    }while(l+10ll<=r);
    DRP(t,r+5ll,max(l-5ll,0ll)) if(chek(t)) return cout<<t<<endl,0;
    return 0;
}

/*
  这道题可以套拟阵?
  交换性很显然,遗传性有吗?
  不管了就这样做 orz yyb

  二分贪心QAQ

  还有24min

  苦辣
 */

转载于:https://www.cnblogs.com/winlere/p/10367981.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值