您的位置:首页 > 其它

bzoj 1600: [Usaco2008 Oct]建造栅栏 枚举

2016-11-15 11:06 351 查看

题意

给出一块长度为n的木板,问有多少种不同的方案使得切割成四块后可以围成一个四边形。

n<=2500

分析

首先要知道若四条边可以围成一个四边形则必须满足任意三边之和大于第四边。

那么我们就枚举前两边的长度x和y,设三、四条边长度分别为z,n-x-y-z,通过上述条件可以推出

z < n/2

z < n-x-y

z > n/2-x-y

那么就可以O(1)算出满足条件的z的取值范围了。

这题貌似还有神奇的排列组合法和动态规划法。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
int n;
scanf("%d",&n);
int n1;
if (n%2==1) n1=n/2+1;
else n1=n/2;
int ans=0;
for (int i=1;i<n1;i++)
for (int j=1;j<n1;j++)
{
int l=max(n/2-i-j+1,1),r=min(n1,n-i-j)-1;
ans+=max(0,r-l+1);
//printf("%d %d %d %d\n",i,j,l,r);
}
printf("%d",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: