AtCoder Tenka1 Programmer Contest D - Crossing【构造】

emmm…

这道题mayflyyh拿给我做的时候只会判有解无解…然后第二天下午突然想到可以直接放进去。


首先来讨论一下有解无解的情况 。

我们将集合视为点,公共元素作为边,转化为无向图,就成了 n n 条边完全图,所以由完全图的性质,若存在 k k 满足下式则有解,否则无解
n = k ( k 1 ) 2 n=\frac{k*(k-1)}{2}

然后考虑放集合。

我们暴力将每个数放进集合中满足条件即可,看代码理解一下就好了…

#include <bits/stdc++.h>
#define pb push_back
using namespace std;

int n,m,cnt;

vector<int>a[1000];

int main() {
	scanf("%d",&n);
	
	for(int i=1;i*(i-1)<=2*n;i++) if(i*(i-1)==n*2) m=i;
	
	if(!m) {
		puts("No");return 0;
	}
	
	puts("Yes");printf("%d\n",m);
	
	for(int i=1;i<=m;i++) for(int j=i+1;j<=m;j++) cnt++,a[i].pb(cnt),a[j].pb(cnt);
	
	for(int i=1;i<=m;i++) {
		printf("%d ",a[i].size());
		for(int j=0;j<a[i].size();j++) printf("%d ",a[i][j]);puts("");
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/yanzhenhuai/article/details/83475047