HDOJ1518

Square

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11375    Accepted Submission(s): 3660

Problem Description
Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square?
 
Input
The first line of input contains N, the number of test cases. Each test case begins with an integer 4 <= M <= 20, the number of sticks. M integers follow; each gives the length of a stick - an integer between 1 and 10,000.
 
Output
For each case, output a line containing "yes" if is is possible to form a square; otherwise output "no".
 
Sample Input
3
4 1 1 1 1
5 10 20 30 40 50
8 1 7 2 6 4 4 3 5
 
Sample Output
yes
no
yes
 
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1518
 



题意:m根有长度棍子是否能拼成一个正方形
利用DFS和剪枝
在DFS之前首先判断所有棍子的长度之和是否为4的倍数进行一次剪枝,接着用for循环便利一遍,如果棍子的长度大于正方形的边长,则不能构成正方形,进行第二次剪枝。
在进行一次排序(由于数据较少,可以省略)。
进行DFS搜索,要标记已经使用了的棍子,一旦不符合要求,就要回溯,并且棍子成为没有使用的状态。
DFS的时候要注意优化:
  当符合要求的棍子数等于5时,说明已经全部构成正方形的边长,结束。
  每当边长达到要求是,进入下一根棍子DFS搜索。
  还有最重要的一点:每次遍历一边棍子不要从0开始,从上一次搜索状态的下一根棍子开始遍历,否者会超时。
           但是因为数据数目少,我个人感觉也不会要太多时间。可能这用方法是卡着时间过得吧。总之还是自己学的不够好。
 
至于这一题的部分思路来源于HDOJ1010 Tempter of the Bone
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010



#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int s[25];
int sign[25];
int sum;
int ave;
int n;
int flag;
void dfs(int t,int len ,int k)
{
int i;
if(t==5)
{
flag=1;
return;
}
if(len==ave)
{
dfs(t+1,0,0);
if(flag) return;
}
for(i=k; i<n; i++) //从前走到后
if(sign[i]==0&&s[i]+len<=ave) //标记使用了的棍子
{
sign[i]=1;
dfs(t,s[i]+len,i+1);
if(flag) return;
sign[i]=0; //回朔,没有使用状态恢复
}
else if(sign[i]==0&&s[i]+len>ave) return;
}
int main()
{
int i,t;
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&s[i]);
sum+=s[i];
}
if(sum%4!=0)//构边的优化
{
cout<<"no"<<endl;
continue;
}
ave=sum/4;
for(i=0; i<n; i++) //有比边长大的边就不行
if(s[i]>ave) break;
if(i<n)
{
cout<<"no"<<endl;
continue;
}
memset(sign,0,sizeof(sign));
sort(s,s+n);
flag=0;
dfs(1,0,0);
if(flag) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}

杭电1518 Square(构成正方形) 搜索的更多相关文章

  1. 杭电ACM分类

    杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...

  2. 杭电ACM题单

    杭电acm题目分类版本1 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 1007 经典问题,最 ...

  3. C#利用POST实现杭电oj的AC自动机器人,AC率高达50%~~

    暑假集训虽然很快乐,偶尔也会比较枯燥,,这个时候就需要自娱自乐... 然后看hdu的排行榜发现,除了一些是虚拟测评机的账号以外,有几个都是AC自动机器人 然后发现有一位作者是用网页填表然后按钮模拟,, ...

  4. HDU-2500 做一个正气的杭电人

    http://acm.hdu.edu.cn/showproblem.php?pid=2500 做一个正气的杭电人 Time Limit: 1000/1000 MS (Java/Others)    M ...

  5. 做一个正气的杭电人--hdu2500

    做一个正气的杭电人 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. 杭电OJ——1007 Quoit Design(最近点对问题)

    Quoit Design Problem Description Have you ever played quoit in a playground? Quoit is a game in whic ...

  7. 杭电dp题集,附链接还有解题报告!!!!!

    Robberies 点击打开链接 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和- 把状态转移方程写成了f ...

  8. 杭电acm习题分类

    专注于C语言编程 C Programming Practice Problems (Programming Challenges) 杭电ACM题目分类 基础题:1000.1001.1004.1005. ...

  9. 『ACM C++』HDU杭电OJ | 1415 - Jugs (灌水定理引申)

    今天总算开学了,当了班长就是麻烦,明明自己没买书却要带着一波人去领书,那能怎么办呢,只能说我善人心肠哈哈哈,不过我脑子里突然浮起一个念头,大二还要不要继续当这个班委呢,既然已经体验过就可以适当放下了吧 ...

随机推荐

  1. MFC笔记1

    1.在对话框文档中定义两个定时器,每间隔5秒弹出一个消息框提示“定时器1”,每隔5秒弹出一个消息框提示“定时器2” UINT ID_TIMER1 = 1 , ID_TIMER2 = 2;   //设置 ...

  2. SXSSExcelUtil

    package com.numa.util; import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.util ...

  3. 解题5(StringMerge1)

    题目描述 按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在字符串 ...

  4. python--第二天总结

    一.作用域只要变量在内存中存在,则就可以使用.(栈) 二.三元运算result = 值result = 值1 if 条件 else 值2 如果条件为真:result = 值1如果条件为假:result ...

  5. 忘记root密码,怎么办

    当前账户拥有sudo权限,可以通过sudo passwd root来重置root密码.

  6. 解决libc.so.6: version `GLIBC_2.14&#39; not found问题

    1.命令检查系统glibc支持的版本: strings /lib64/libc.so.6 |grep GLIBC_ 如果没有2.14或者其他版本的,需要下载安装 2.下载地址:http://pan.b ...

  7. Android 心跳动画

    直接上代码  MainActivity public class MainActivity extends AppCompatActivity { private ImageView ivHart; ...

  8. JAVA 基本数据结构--数组、链表、ArrayList、Linkedlist、hashmap、hashtab等

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

  9. SSH和SSM的区别

    一怒成仙 博客园 首页 新随笔 联系 管理 订阅 随笔- 54  文章- 1  评论- 0    SSH(Struts,Spring,Hibernate)和SSM(SpringMVC,Spring,M ...

  10. vue项目微信分享之后路由链接被破坏怎么办

    异常现象: 多页面应用,路由采用hash模式,链接带有"#". 在微信中分享到朋友圈或好友时,分享出去的路由被破坏,打开分享的链接,路由中的“#”会被去掉并追加?fromTimel ...