生老病死 自然规律 珍惜当下 享受当下
一、思维 / 二分
题目:数字组合
思路:所有情况遍历时间复杂度是 O (n ^ 4),所以我们可以拆成2个人一组去暴力枚举,时间复杂度 O (n ^ 2),记录两个数字之和出现的次数,对于前两个人可以取得的值 x ,判断是否存在 -x, 这样两个相加和为 0 ,组合数量为 num1[x] * num2[-x],题目的标签是二分,时间复杂度为 O (n ^ 2 * logn),但是该方法完全可以实现 O (n ^ 2) 的时间复杂度通过这道题
代码:
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define ff first
#define ss second
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
vector<vector<int>>a(n + 5, vector<int>(5));
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= 4; j++)
{
cin >> a[i][j];
}
}
unordered_map<int, int>v, mp;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
int ans = a[i][1] + a[j][2];
v[ans]++;
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
int ans = a[i][3] + a[j][4];
mp[ans]++;
}
}
int sum = 0;
for (auto i : v)
{
sum += i.ss * mp[-i.ff];
}
cout << sum;
}
有趣的是我一开始是直接用了 map,所以跑出了十连重测,最后竟然跑过去了哈哈哈,第一次在十连重测取得 AC
总结
爽刷了二分专题,不得不说牛客的精选题单质量真是杠杠的(相见恨晚),不会三分,明天学学,晚安
2025/7/4 01:29