华为0819笔试第一题100%第二题60%第三题0%
1.力扣顺时针打印矩阵的题很像,加个判断就行
2.某一层的结点数量为cur,上一层为pre,那么能生成的二叉树就为:2*pre里面选cur种,即
麻烦大佬帮着看看。
const int mod = 1e9 + 7;
long long sum(int i, int n)
{
if (i == 0 || i == n)return 1;
if (i == 1 || i == n - 1)return n;
if (i>n / 2)i = n - i;
long long up = 1, bt = 1;
for (int k = i; k >= 2; k--)
{
bt *= k;
}
for (int k = n; k >= n - i + 1; k--)
{
up *= k;
}
return up / bt;
}
int main()
{
int n;
while (cin >> n)
{
vector<int> v(n);
for (int i = 0; i<n; i++)
{
int num;
cin >> num;
v[i] = num;
}
sort(v.begin(), v.end());
vector<int> temp;
int count = 1;
for (int i = 1; i<n; i++)
{
if (v[i] != v[i - 1])
{
temp.push_back(count);
count = 1;
}
else
{
count++;
}
}
temp.push_back(count);
long long res = 1;
int pre = temp[0];
int flag = 1;
for (int i = 1; i<temp.size(); i++)
{
int cur = temp[i];
if (cur>2 * pre)
{
flag = 0;
break;
}
res *= sum(cur, 2 * pre);
pre = temp[i];
res %= mod;
}
if (!flag)cout << 0 << endl;
else cout << res%mod << endl;
}
return 0;
} 第三题俄罗斯方块,看着没啥思路就去想第二题去了 好像暴力模拟就行 有点难受。

查看23道真题和解析