求求好心人帮我讲解一下
2 个赞
搭扑克牌塔:二分加预处理。
核心代码:
int x=0,y=2,z=-1;
while(x<=1e10)
{
x+=y;y+=3;z++;
a[z]=x;
}
while(1)
{
if(n<2)break;
for(long long i=1;;i++)
{
if(a[i]>n)
{
ans++;
n-=a[i-1];
break;
}
}
}
1 个赞
给个解决方案*(完美石堆我也不太会)*
完美石堆:
for(int i=1;i<=n;i++)b[i]=a[i];//复只
for(int i=n;i>=3;i--){
if(b[i]<mid)f=0;//特判
int t=min((b[i]-mid)/3 ,a[i]/3);//取小值 因为是顺序的
b[i-1]+=t;//题目要求
b[i-2]+=t*2;
b[i]-=t*3;
}if(b[2]<mid||b[1]<mid)f=0;//特判
return f;
while(l+1<r){//二分我不用多说了
int mid=(l+r)/2;
if(check(mid))l=mid;
else r=mid;
}
1 个赞
我建议你再发一个帖子,解决方案平分,每人一个
1 个赞
![]()
1 个赞
![]()