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

構造題。題目大意:構造一棵有N個節點,其中K個是孩子節點的樹,讓它的直徑最小,並輸出這棵樹的所有邊和直徑。

不難發現,孩子節點越多,這棵樹的直徑就越小。那麼我們考慮刪去K個孩子節點後的樹。這棵樹的孩子節點數肯定不能超過K,所以就讓它的孩子節點數爲K。一直進行下去,我們就得到了一棵每片花瓣長度爲K或K-1的菊花樹。那麼這樣構造出來的樹就能滿足直徑最小。

那麼直徑是多少呢?你可以跑出來,當然也可以直接算。這裏我就不贅述了,大家看我代碼吧。


#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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章