P6269 [SHOI2002]空中都市 题解

原题链接简要题意:求在 nnn 个点中满足每 333 个点不两两有边的最多边数。首先,这题 dp\text{dp}dp 没有头绪,所以只能手动找规律。n\texttt{n}n000111222333444555666ans\texttt{ans}ans000000111222444666999如果你不明白,这里给出 n>3n>...
摘要由CSDN通过智能技术生成

博客园同步

原题链接

简要题意:

求在 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 n3 就不用画图了吧)

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 N1k 中的任意一点不可能向外连线数大于 k k k,设这些点连线总数为 y y y,则有

y ≤ k ( N − 1 − k ) + k y≤k(N-1-k)+k ykN1k+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 yk2+Nk=(kN/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 yN2/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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值