CF2111B
首先最大的 \(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;
}

浙公网安备 33010602011771号