写在前边
AcWing 4797. 移动棋子
原题连接
计算当前位置到中心的哈夫曼距离即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int res = 0;
for (int i = 1; i <= 5; i ++) {
for (int j = 1; j <= 5; j ++) {
int x;
std::cin >> x;
if (x == 1) {
res = abs(i - 3) + abs(j - 3);
}
}
}
std::cout << res << "\n";
return 0;
}
AcWing 4798. 打怪兽
原题连接
二分 + 小贪一手
二分答案,假设二分的为mid,那么将前1~mid从小到大排序,然后两两取大的bi,然后判断能否超过法力值即可。
赛时二分写挂了,l与r写反,b[i] 写成了 a[i], G~~
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n,k;
std::cin >> n >> k;
std::vector<int> a(n + 1);
for (int i = 1; i <= n; i ++) {
std::cin >> a[i];
}
int l = 1,r = n;
auto check = [&](int mid) {
auto b = a;
sort(b.begin() + 1, b.begin() + 1 + mid);
int t = 0;
for (int i = mid; i >= 1; i -= 2) {
t += b[i];
}
if (t > k) return false;
else return true;
};
while (l < r) {
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
std::cout << r << '\n';
return 0;
}
AcWing 4799. 最远距离
原题连接
树形DP(模板题)
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const int N = 100100, M = N * 2;
int h[N],e[M],w[M],ne[M],idx;
int n,m;
int ans;
void add(int a,int b,int c)
{
e[idx] = b,w[idx] = c,ne[idx] = h[a],h[a] = idx++;
}
int dfs(int u,int f)
{
int dist = 0;
int d1 = 0,d2 = 0;
for(int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
if(j == f) continue;
int d = dfs(j,u) + w[i];
dist = max(dist,d);
if(d > d1) d2 = d1,d1 = d;
else if (d > d2) d2 = d;
}
ans = max(ans,d1 + d2);
return dist;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
memset(h,-1,sizeof h);
for(int i = 0; i < m; i ++ )
{
int a,b;
cin >> a >> b ;
add(a,b,1),add(b,a,1);
}
dfs(1,-1);
cout << ans << "\n";
return 0;
}