Sunday最近对图论特别感兴趣,什么欧拉回路什么哈密顿回路,又是环又是树。在看完一本书后,他对自己特别有信心,便找到大牛牛犇犇,希望他出一题来考考自己。
在遥远的古代东方有N个城市,它们之间可以通过双向的道路相连。任意两个城市由不超过一条道路直接相连,而且没有城市的道路连向自身。但是牛犇犇是个纯情的小伙子,尽管他还没有女朋友,但他还是很讨厌第三者,以至于讨厌三这个数字。所以他希望Sunday能够构造一个N个城市的地图,这个地图中不能有任意三个城市能够相互直接到达,而且地图中的道路数目最多。
牛犇犇考虑到Sunday是个菜鸟,所以只让他回答上述地图含有的道路数目,而不需要输出地图是由哪些道路组成。(题外话:其实只是因为special judge的评测程序比较麻烦而已)
第一行一个整数T(1 <= T <= 100),表示测试数据的组数。
每组数据只包含一个N(1 <= N <= 1000),表示N个城市。
每组数据输出仅有一行,表示在符合题意下N个城市所能连接的最大道路数目。
2 3 4Sample Output
2 4
题意:现在有n个点,这n个点之间可以连一些线,两个点之间最多只能有一条线,现在连线要求是:任意选三个点,这三个点不能两两相连。1 连2,2连3,那么1就不能连3了, 任意三个点都有这个限制,求这n个点最多能有多少个连线?
思路:要想不出现三个点的环,有一个要求,新出现的点 不能同时连接 已经连接的两个点。及1连2,那么新出现的3,就不能同时连接1和2; 这个思路主要是这一条,就能解决该题。
1 个点的时候 :1
2 个点的时候 :1,2 (1-2)//我用这个来表示连线关系
3 个点的时候 :1,2,3 (1-2) (2-3)
4 个点的时候 :1,2,3,4 (1-2) (2-3) (1-4)(3-4)
5 个点的时候 :1,2,3,4,5 (1-2) (2-3) (1-4)(3-4) (2-5)(4-5)
6 个点的时候 :1,2,3,4,5,6 (1-2) (2-3) (1-4)(3-4) (2-5)(4-5) (1-6)(3-6)(5-6)
7 个点的时候 :1,2,3,4,5,6,7 (1-2) (2-3) (1-4)(3-4) (2-5)(4-5) (1-6)(3-6)(5-6) (2-7)(4-7)(6-7)
你会发现新出现的点n先跟 n-1连接,因为相邻的两个点都已经连接了,所以每间隔一个就连接一个(这样能保证最多的连线)
#include <iostream>
#include <stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int ans[1500];
int main()
{
ans[0]=0;
for(int i=1;i<=1000;i++)
ans[i]=ans[i-1]+i/2;
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
printf("%d\n",ans[n]);
}
}