CodeForces 828D High Road

来源:互联网 发布:怎么报送发票数据 编辑:程序博客网 时间:2024/05/22 17:46

题目链接:https://vjudge.net/problem/CodeForces-828D

题意:

有n个节点,这n个节点中有k个叶子节点,构造成一棵树,请给出一个最优方案,使得树的直径最小。

思路:

在保证是一棵树且使得树的直径最小,可以想象,像树的年轮一样一层一层往外扩展,才能满足题目条件。最中间放一个节点,然后每一圈的长度为k(保证有k个叶子),一圈一圈往外放。
当(n-1)%k==0时,最远距离为2*(n-1)/k;
当(n-1)%k==1时,最远距离为2*((n-1)/k)+1;
当(n-1)%k>=2时,最远距离为2*((n-1)/k)+2。

总结:

比赛时像在梦游。

代码:

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <queue>#include <vector>using namespace std;int main(){    int n, k;    cin>>n>>k;    int tmp = 2*((n-1)/k);    int yu = (n-1)%k;    if(yu==1) ++tmp;    if(yu>=2) tmp += 2;    cout<<tmp<<endl;    int idx = 1;    for(int i=1; i<=k; ++i){        cout<<++idx<<" "<<1<<endl;    }    while(idx<n){        for(int i=1; i<=k&&idx<n; ++i){            ++idx;            cout<<idx<<" "<<idx-k<<endl;        }    }    return 0;}