您的位置:首页 > 其它

CodeForces 828D High Road

2017-08-09 20:36 381 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: