简要题意:
求在 n n n 个点中满足每 3 3 3 个点不两两有边的最多边数。
首先,这题 dp \text{dp} dp 没有头绪,所以只能手动找规律。
n \texttt{n} n | 0 0 0 | 1 1 1 | 2 2 2 | 3 3 3 | 4 4 4 | 5 5 5 | 6 6 6 |
---|---|---|---|---|---|---|---|
ans \texttt{ans} ans | 0 0 0 | 0 0 0 | 1 1 1 | 2 2 2 | 4 4 4 | 6 6 6 | 9 9 9 |
如果你不明白,这里给出 n > 3 n>3 n>3 的所有构造图( n ≤ 3 n \leq 3 n≤3 就不用画图了吧)
n = 4 n=4 n=4 时答案为 4 4 4:
n
=
5
n=5
n=5 时答案为
6
6
6:
n = 6 n=6 n=6 时答案为 9 9 9:
所以,我们在看一眼这个表格:
n \texttt{n} n | 0 0 0 | 1 1 1 | 2 2 2 | 3 3 3 | 4 4 4 | 5 5 5 | 6 6 6 |
---|---|---|---|---|---|---|---|
ans \texttt{ans} ans | 0 0 0 | 0 0 0 | 1 1 1 | 2 2 2 | 4 4 4 | 6 6 6 | 9 9 9 |
然后,因为我们觉得可以 O ( 1 ) O(1) O(1) 用公式计算,盲猜它次数应该不会超过 4 4 4 次,所以就假设答案 f x = a x 4 + b x 3 + c x 2 + d x + e f_x = ax^4 + bx^3 + cx^2+dx+ e fx=ax4+bx3+cx2+dx+e.
然后得到方程组:
{ a + b + c + d + e = 0 16 a + 8 b + 4 c + 2 d + e = 1 81 a + 27 b + 9 c + 3 d + e = 2 256 a + 64 b + 16 c + 4 d + e = 4 625 a + 125 b + 25 c + 5 d + e = 6 1256 a + 216 b + 36 c + 6 d + e = 9 \begin{cases} a + b + c + d + e = 0 \\ 16a + 8b + 4c + 2d + e = 1 \\ 81a + 27b + 9c + 3d + e = 2 \\ 256a + 64b + 16c + 4d + e = 4 \\ 625a + 125b + 25c + 5d + e = 6 \\ 1256a + 216b + 36c + 6d + e = 9 \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧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 = 0 b = 0 c = 1 4 d = 0 e = 0 \begin{cases} a=0 \\ b=0 \\ c=\frac{1}{4} \\ d=0 \\ e=0 \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧a=0b=0c=41d=0e=0
即答案为 ( n 2 4 ) \bigg( \frac{ n^2}{4} \bigg ) (4n2).
你整理一下发现,答案其实是:
⌊ n 2 4 ⌋ \bigg \lfloor \frac{n^2}{4} \bigg \rfloor ⌊4n2⌋
然后你就用 O ( 1 ) O(1) O(1) 解决了问题。
下面给出一个 严谨 一点的解法。
下面资料来自 百度百科——托兰定理
设 A A A 为 N N N 个点中,向外连线最多的点,设它向外连 k k k 条线,则与 A A A 相连的点之间不允许连线
而剩余 N − 1 − k N-1-k N−1−k 中的任意一点不可能向外连线数大于 k k k,设这些点连线总数为 y y y,则有
y ≤ k ( N − 1 − k ) + k y≤k(N-1-k)+k y≤k(N−1−k)+k
y ≤ − k 2 + N k = − ( k − N / 2 ) 2 + ⌊ N 2 / 4 ⌋ y≤-k^2+Nk=-(k-N/2)^2+ \lfloor N^2/4 \rfloor y≤−k2+Nk=−(k−N/2)2+⌊N2/4⌋
当 k = ⌊ N / 2 ⌋ k= \lfloor N/2 \rfloor k=⌊N/2⌋ 时, y y y 是整数,所以 y y y的最大值为 ⌊ N 2 / 4 ⌋ \lfloor N^2/4 \rfloor ⌊N2/4⌋
所以 y ≤ ⌊ N 2 / 4 ⌋ y≤ \lfloor N^2/4 \rfloor y≤⌊N2/4⌋
得证。
时间复杂度: O ( 1 ) O(1) O(1).
实际得分: 100 p t s 100pts 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;
}