【题解】扑克牌游戏

【题解】扑克牌游戏

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

显然可以拿\(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

  苦辣
 */

猜你喜欢

转载自www.cnblogs.com/winlere/p/10367981.html