abc 321 C
有一个隐藏的条件,所有数字不重复,那么可以用二进制遍历 10 个数中取那些
要求二进制数中 1 的个数等于其长度,二进制数增大的过程,构成相同长度的数是单调递增的
如何在二进制数的遍历中排除 0 的可能 :
当长度为 1 时,不可以取 0,并且对于长度大于 1 的组合,0000000001是取不到,二进制数从 2 开始遍历
没有给 k 的数据范围,但由该方法可以推出计算的次数为 2 ^ 10 * 10
int res = 0;
for (int i = 1; i <= 10; i ++)
{
for (int j = 2; j < (1 << 10); j ++)
{
if (__builtin_popcount(j) == i) // j 中 1 的个数
{
res ++;
if (res == k)
{
for (int k = 9; k >= 0; k --)
if (j >> k & 1) cout << k;
return 0;
}
}
}
}
abc 320 C
竟然 n ^ 3 的时间复杂度可以过。。。
那就直接嵌套循环好了
abc 319 C
枚举 p 的全排列
next_permutation()会取得[first,last)所标示之序列的下一个排列组合,如果没有下一个排列组合,便返回false;否则返回true,可以不用写dfs
题目几乎没读懂,但要做的是看所有排列有多少满足条件的
do {
tot++;
bool ok = true;
for (auto &l : line) {
std::sort(l.begin(), l.end(),
[&](int i, int j) {
return p[i] < p[j];
});
if (c[l[0]] == c[l[1]] && c[l[0]] != c[l[2]]) {
ok = false;
}
}
good += ok;
} while (std::next_permutation(p, p + 9));
abc 317 C
// DFS
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
vector<PII> ne[11];
int n, m;
bool check[11];
int dfs(int u)
{
int res = 0;
for (auto i : ne[u])
{
if (!check[i.first])
{
check[i.first] = true;
res = max(dfs(i.first) + i.second, res);
check[i.first] = false;
}
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
while (m --)
{
int a, b, c;
cin >> a >> b >> c;
ne[a].push_back({b, c});
ne[b].push_back({a, c});
}
int ans = 0;
for (int i = 1; i <= n; i ++)
{
check[i] = true;
ans = max(ans, dfs(i));
check[i] = false;
}
cout << ans << '\n';
return 0;
}
abc 316 C
才发现 abc 没有 316