搭扑克牌塔和完美石堆!谁来救我!

求求好心人帮我讲解一下

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 个赞

:joy: :joy:

1 个赞

:rofl: :rofl: :rofl: