ACGO挑战赛#20题解(前3题)
2025-07-13 20:09:14
发布于:北京
第一题 小午的222
n = input().strip()
if len(n) == 1:
# 只有一位数字,没有末尾0
first = int(n)
zeros = 0
else:
first = int(n[0])
zeros = len(n) - 1
计算最高位能被2整除的次数
count = 0
num = first
while num % 2 == 0:
count += 1
num //= 2
总次数 = 最高位的次数 + 末尾0的个数
print(count + zeros)
第二题 午枫的01树中心
n = int(input())
a = list(map(int, input().split()))
adj = [[] for _ in range(n + 1)]
for _ in range(n - 1):
u, v = map(int, input().split())
adj[u].append(v)
adj[v].append(u)
count = 0
for x in range(1, n + 1):
current_val = a[x - 1]
valid = True
for neighbor in adj[x]:
if a[neighbor - 1] == current_val:
valid = False
break
if valid:
count += 1
print(count)
第三题 午枫爱搬家2C++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<long long> dp(m + 1, 0);
for (int i = 0; i < n; i++) {
int w, v;
cin >> w >> v;
for (int j = m; j >= w; j--) {
if (dp[j - w] + v > dp[j]) {
dp[j] = dp[j - w] + v;
}
}
}
cout << dp[m] << endl;
return 0;
}
这里空空如也
有帮助,赞一个