Acwing 第 87 场周赛题解

写在前边

在这里插入图片描述

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;   
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值