您的位置:首页 > 其它

Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) B HIGH ROAD

2017-07-12 14:13 561 查看
构造题。题目大意:构造一棵有N个节点,其中K个是孩子节点的树,让它的直径最小,并输出这棵树的所有边和直径。

不难发现,孩子节点越多,这棵树的直径就越小。那么我们考虑删去K个孩子节点后的树。这棵树的孩子节点数肯定不能超过K,所以就让它的孩子节点数为K。一直进行下去,我们就得到了一棵每片花瓣长度为K或K-1的菊花树。那么这样构造出
4000
来的树就能满足直径最小。

那么直径是多少呢?你可以跑出来,当然也可以直接算。这里我就不赘述了,大家看我代码吧。

#include<bits/stdc++.h>
int n,k,sc[200100];
int main(){
scanf("%d%d",&n,&k);
for(int i=0;i<k;i++) sc[i]=1;
printf("%d\n",(n-2+k)/k*2-((n-1)%k==1));
for(int i=2;i<=n;i+=k){
for(int j=0;j<k&&j+i<=n;j++){
printf("%d %d\n",sc[j],i+j);
sc[j]=i+j;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐