题意:
给一个N,求构造一个N个点的无向图,保证没有任意三个点相互直接相连,使边数最多。
思路:
可以画几个点去找规律,n==2时ans=1,n==3时ans=2,n>3时,ans[n] = ans[n-1]+key,key是从第4个开始变化2,2,3,3,4,4,5,5...所以预处理一下,输出答案即可。
还可以利用二分图的性质,对于完全二分图任意加一条边都会导致出现三角形,所以我们使n个点尽量均分到二分图的A、B部,然后求完全二分图的边数[(n/2)*(n-n/2)]就是答案。
代码:
#include <bits/stdc++.h>
using namespace std;
int ans[1005];
void init()
{
ans[2] = 1, ans[3] = 2;
int key = 2, cnt = 2;
for(int i = 4; i <= 1000; ++i)
{
ans[i] = ans[i-1]+key, --cnt;
if(!cnt) cnt = 2, ++key;
}
}
int main()
{
int t, n, x;
cin >> t; init();
while(t--)
{
cin >> n;
cout << ans[n] << endl;
}
return 0;
}
/************************************/
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t, n;
cin >> t;
while(t--)
{
cin >> n;
cout << (n/2)*(n-n/2) << endl;
}
return 0;
}
继续加油~