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
- poj 2362 Square
- poj 2362 Square
- poj 2362Square(DFS)
- poj 2362 Square
- POJ 2362 Square dfs
- poj 2362 Square
- POJ-2362-Square
- POJ 2362 Square
- poj 2362 Square
- poj 2362 Square
- POJ 2362 Square
- POJ 2362 Square DFS
- POJ 2362 Square
- poj 2362 Square
- poj 2362 Square
- POJ - 2362 Square
- poj 2362 Square
- poj 2362:Square
- struts之Action中获取request、response对象的方法
- LA_3213_AncientCipher
- 29 Divide Two Integers
- cookie与session的区别
- block inline inline-block
- POJ 2362 Square
- 写给计算机的大学生
- 如何编写makefile文件
- C语言的赋值语句是不是原子操作?
- Oracle查询表空间使用情况
- Android UI设计(引导界面):ViewPager之二滑动切换效果
- JavaScript学习笔记-JavaScript声明全局变量三种方式的异同
- application,requset,session三个对象的用法
- 犀牛——第8章函数 8.4作为值的函数