博客园同步
原题链接
简要题意:
求在
n 个点中满足每
3 个点不两两有边的最多边数。
首先,这题
dp 没有头绪,所以只能手动找规律。
n |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
ans |
0 |
0 |
1 |
2 |
4 |
6 |
9 |
如果你不明白,这里给出
n>3 的所有构造图(
n≤3 就不用画图了吧)
n=4 时答案为
4:
n=5 时答案为
6:
n=6 时答案为
9:
所以,我们在看一眼这个表格:
n |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
ans |
0 |
0 |
1 |
2 |
4 |
6 |
9 |
然后,因为我们觉得可以
O(1) 用公式计算,盲猜它次数应该不会超过
4 次,所以就假设答案
fx=ax4+bx3+cx2+dx+e.
然后得到方程组:
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧a+b+c+d+e=016a+8b+4c+2d+e=181a+27b+9c+3d+e=2256a+64b+16c+4d+e=4625a+125b+25c+5d+e=61256a+216b+36c+6d+e=9
(好像还多了一道方程)
你发现答案 近似 为:
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧a=0b=0c=41d=0e=0
即答案为
(4n2).
你整理一下发现,答案其实是:
⌊4n2⌋
然后你就用
O(1) 解决了问题。
下面给出一个 严谨 一点的解法。
下面资料来自 百度百科——托兰定理
设
A 为
N 个点中,向外连线最多的点,设它向外连
k 条线,则与
A 相连的点之间不允许连线
而剩余
N−1−k 中的任意一点不可能向外连线数大于
k,设这些点连线总数为
y,则有
y≤k(N−1−k)+k
y≤−k2+Nk=−(k−N/2)2+⌊N2/4⌋
当
k=⌊N/2⌋ 时,
y 是整数,所以
y的最大值为
⌊N2/4⌋
所以
y≤⌊N2/4⌋
得证。
时间复杂度:
O(1).
实际得分:
100pts.
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
int main(){
int n=read();
printf("%d\n",n*n/4);
return 0;
}