A:
思路:其实题目已经很仁至义尽了,2* 2的情况给了,如果包含一个2*2的,那么之后的再也不可能构成了。1的时候特殊判断。
代码如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
if(n==1||m==1) cout<<"YES"<<endl;
else if(n==2&&m==2) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
B:
思路:找出规律,然后预处理出所有1e9之内的情况。二分去找最大的能构成的金字塔,直到不能构成金字塔。
代码如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxx=1e5+100;
int a[maxx];
int n;
inline int init()
{
a[1]=2;
int cnt=2;
int i=1;
while(a[i]<=1e9)
{
i++;
a[i]=a[i-1]+2*i+i-1;
}
return i;
}
int main()
{
int t;
scanf("%d",&t);
int cnt=init();
while(t--)
{
scanf("%d",&n);
int ans=0;
while(1)
{
int pos=upper_bound(a+1,a+1+cnt,n)-a-1;
if(pos==0) break;
ans++;
n-=a[pos];
}
cout<<ans<<endl;
}
return 0;
}
努力加油a啊,(o)/~