A: AcWing 4491. 数组操作
关键词:
前缀和
题意:
给定一个数组,求sum - 最小前缀和
思路:
遍历
AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 105;
int n;
int a[N], s[N];
int main()
{
cin >> n;
int res = 0, sum = 0;
for (int i = 1; i <= n; i ++)
{
cin >> a[i];
sum += a[i];
s[i] = s[i - 1] + a[i];
res = min(res, s[i]);
}
cout << sum - res << endl;
return 0;
}
B:AcWing 4492. 减法操作
关键词:
数论
题意:
给定一个整数 n,执行如下算法:
- 如果 n=0,则结束算法。
- 找到 n 的最小质因子 d。
- 令 n 减去 d 并跳转步骤 1。
请你计算,在算法执行的过程中,一共进行了多少次减法操作。
思路:
如果n是偶数,最小质因子 d 就为2,则经过n / 2次 -2 后变成 0,若 n 是奇数,则减去一个最小质因子(一定为奇数)后,变成偶数同上步骤。
AC代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 1e10;
int main( )
{
cin.tie(0), cout.tie(0);
ios::sync_with_stdio(false);
LL n;
cin >> n;
LL cnt = 0;
if (n % 2 != 0) // 若 n 不是偶数
{
for (int i = 2; i <= n / i; i ++)
if (n % i == 0)
{
cnt ++;
n -= i;
break;
}
if (n % 2 != 0) cnt ++, n = 0; // n 本身是质因子
}
cnt += n / 2;
cout << cnt << endl;
return 0;
}
C:AcWing 4493. 环形连通分量
关键词:
并查集
题意:
给定一个 n 个点 m 条边组成的无重边无自环的无向图。请你计算,其包含的所有连通分量中,有多少个是简单环(不同于通常图论定义,就是一个圈)
思路:
简单环 ⇔ 每个点的度数为2,所以可以维护一个并查集进行加边,并且进行遍历判断每个点的度数是否为2
AC代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 200005;
int n, m;
int p[N], degree[N]; // 并查集数组
bool st[N];
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
cin.tie(0), cout.tie(0);
ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= n; i ++) p[i] = i;
while (m --)
{
int a, b;
cin >> a >> b;
p[find(a)] = find(b);
degree[a] ++; // 每个点的度数加1
degree[b] ++;
}
for (int i = 1; i <= n; i ++)
if (degree[i] != 2)
st[find(i)] = true;
int res = 0;
for (int i = 1; i <= n; i ++)
if (p[i] == i && !st[find(i)])
res ++;
cout << res << endl;
return 0;
}