首页 > 其他 > 详细

【Codeforces 827B】High Load

时间:2019-04-12 17:59:02      阅读:128      评论:0      收藏:0      [点我收藏+]

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


题意

【题解】


树的最长链是一定会经过两个叶子节点的。
我们可以构造一棵树,让最后的最长链一定是由经过根节点的两条链组成。
然后让这两条链的长度尽可能短就好。
那么创建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;
}

【Codeforces 827B】High Load

原文:https://www.cnblogs.com/AWCXV/p/10697560.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!