POJ 2362 Square

来源:互联网 发布:安卓串口软件 编辑:程序博客网 时间:2024/05/21 19:47

题目大意:

给出一堆木棒,问是否能拼成一个正方形。


解题思路:

把所有木棒长度加起来/4得到一条边的长度,然后把木棒从大到小排序,dfs。

有几个可以优化的地方。

1,长度和%4必须等于零。

2,如果最长的木棒长于边长则不行。

3,满足以上条件的时候只要搜索了三条边即可。


#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include <map>#include<vector>#include<set>#define LL long long#define db double#define EPS 1e-15#define inf 1e16#define pa pair<int,int>using namespace std;LL read(){    LL x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}int T,n;int ave,mx,mn;int a[105];bool sel[105];bool dfs(int x,int num,int tot){if (tot==ave) num++, tot=x=0;if (mn+tot>ave) return 0;if (num==3) return 1;int last=-1;for (int i=x+1;i<=n;i++)if (!sel[i]){if (a[i]==last) continue;sel[i]=1;if (dfs(i,num,tot+a[i])) return 1;sel[i]=0;last=a[i];}return 0;}int main(){T=read();while (T--){ave=mx=0; mn=inf;memset(sel,0,sizeof(sel));n=read();for (int i=1;i<=n;i++) a[i]=read();sort(a+1,a+n+1,greater<int>());for (int i=1;i<=n;i++){ave+=a[i]; mx=max(mx,a[i]);mn=min(mn,a[i]);}if (ave%4) {puts("no"); continue;}ave/=4;if (mx>ave) {puts("no"); continue;}sel[1]=1;if (dfs(1,0,a[1])) puts("yes");else puts("no");}return 0;}


0 0
原创粉丝点击