题解:LOJ540游戏

题目描述

小L计划进行n场游戏,每场游戏使用一张地图,小 L 会同时使用三辆车在该地图上完成游戏。
小 L 的赛车有三辆,分别用大写字母 A、B、C 表示。地图是一张无向简单图(没有重边或自环),每次他会在地图中选择不同的三个点 i,j,k满足\(i<j<k\)且两两之间均有边。此时他会让 A 从i到j,B 从j到k,C从k到i,完成一场游戏。他记得有一张地图使得他恰好能完成n场不同的游戏,且这个地图顶点数不超过500,请你帮他找到这张地图。
有时候小L会记得地图的一些特点,他会把这些告诉你以帮助你找到地图。
也就是说,给一个正整数n,请你构造一个无向简单图使得其三元环个数为n。

说实话这个题一看以为是什么高深的玩意,完全看不出是NOIP的难度

做这个题的时候,各位神犇需要做的就是,把之前学的各种算法,数据结构全忘了QAQ
蒟蒻的搜索T到飞起

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;

#define re register
#define ll long long
#define gc getchar()
inline int read()
{
 	re int x(0),f(1);re char c(gc);
    while(c>'9'||c<'0')f=c=='-'?-1:1,c=gc;
    while(c>='0'&&c<='9')x=x*10+c-48,c=gc;
    return f*x;
}

const int N=505;
int f[N][N],a[N],b[N],c[N],n;

int main()
{
    n=read();
    int i,tot;
    for(tot=1;n;tot++)
    {
		for(i=1;i<tot&&i*(i-1)/2<=n;i++)
			f[i][tot]=1;
		n-=(i-1)*(i-2)/2;
	}
    cout<<tot<<endl;
    for(i=1;i<tot;i++)
    {
		for(int j=i+1;j<=tot;j++)
			cout<<(f[i][j]|f[j][i])<<" ";
		cout<<endl;
	}
    return 0;
}
原文地址:https://www.cnblogs.com/zijinjun/p/10695125.html