【Codeforces 827B】High Load

【链接】 我是链接,点我呀:)
【题意】

题意

【题解】

树的最长链是一定会经过两个叶子节点的。 我们可以构造一棵树,让最后的最长链一定是由经过根节点的两条链组成。 然后让这两条链的长度尽可能短就好。 那么创建k个叶子节点,然后从左往右依次加上去就好,即让每一条叶子节点到根节点的路径都竟可尽可能短(平均分配剩余的n-k-1个节点) (直接除k输出应该也问题不大。)

【代码】

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5;

int n,k;
int a[N+10],cnt[N+10];
vector<pair<int,int> >v;

int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    cin >> n >> k;
    for (int i = 1;i <= k;i++) a[i] = i;
    for (int i = k+1;i <= n-1;i++){
        v.push_back(make_pair(a[i%k+1],i));
        a[i%k+1] = i;
        cnt[i%k+1]++;
    }
    sort(cnt+1,cnt+1+k);
    int ans = cnt[k]+cnt[k-1]+2;
    for (int i = 1;i <= k;i++){
        v.push_back(make_pair(a[i],n));
    }
    cout<<ans<<endl;
    for(int i = 0;i < (int)v.size();i++){
        int x = v[i].first;int y = v[i].second;
        cout<<x<<" "<<y<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/10697560.html