【题解】扑克牌游戏
假如我们知道一个答案,那么我们剩下的问题就是去检查这个答案是否合法。
显然可以拿\(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
时间: 2024-10-10 10:07:33