蓝桥杯练习题笔记(五)
1. 妖梦拼木棒
题目背景
上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来。
题目描述
有 n n n 根木棒,现在从中选 4 4 4 根,想要组成一个正三角形,问有几种选法?
答案对 1 0 9 + 7 10^9+7 109+7 取模。
输入格式
第一行一个整数 n n n。
第二行往下 n n n 行,每行 1 1 1 个整数,第 i i i 个整数 a i a_i ai 代表第 i i i 根木棒的长度。
输出格式
一行一个整数代表答案。
样例 #1
样例输入 #1
4
1
1
2
2
样例输出 #1
1
提示
数据规模与约定
- 对于 30 % 30\% 30% 的数据,保证 n ≤ 5 × 1 0 3 n \le 5 \times 10^3 n≤5×103。
- 对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 1 0 5 1 \leq n \le 10^5 1≤n≤105, 1 ≤ a i ≤ 5 × 1 0 3 1 \le a_i \le 5 \times 10^3 1≤ai≤5×103。
- 官方网页的一个题解:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=5*1e3+500,mod=1e9+7;
int num[maxn],n,Max=-1,Min=0x3f3f,ans=0;
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
num[a]++;
Max=max(Max,a);Min=min(Min,a);
}
for(int i=Min+1;i<=Max;i++)
{
if(num[i]>=2)
{
for(int j=Min;j<=i/2;j++)
{
if(j!=i-j)
ans+=num[i]*(num[i]-1)*num[j]*num[i-j]/2%mod;
else if(num[j]>=2&&j*2==i)
ans+=num[i]*(num[i]-1)*num[i/2]*(num[i/2]-1)/4%mod;
}
ans%=mod;
}
}
cout<<ans;
}
值得学习的点:
- 首先用了一个循环和数组对所有数字进行计数,后续只需要查找满足条件的数字(木棍)再进行进一步的分析就行了
- 第二个循环的起止条件值得学习(max和min)的得到