首先最大的 \(f_n\) 必须放的下,即 \(f_n \le \min(w,l,h)\)。此外,\(f_{n-1}\) 紧贴在 \(f_n\) 的一个面上,故要 \(f_n+f_{n-1} \le \max(w,l,h)\)。剩下的第 \(i\) 个正方体由于满足 \(f_{i+2}=f_{i}+f_{i+1}\),故只需与第 \(i+1,i+2\) 个正方体共用一条棱即可,且一定不会占用满空间,可以参照样例的图理解。时间复杂度 \(O(\sum m)\)。
#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
int n,m,f[101],x,y,z;
void solve(){cin>>n>>m;while(m--){cin>>x>>y>>z;if(x>=f[n]&&y>=f[n]&&z>=f[n]){if(x-f[n]>=f[n-1]||y-f[n]>=f[n-1]||z-f[n]>=f[n-1])cout<<1;else cout<<0;}else cout<<0;}cout<<'\n';
}
signed main(){f[1]=1,f[2]=2;for(int i=3;i<=10;i++)f[i]=f[i-1]+f[i-2];int T;cin>>T;while(T--)solve();return 0;
}