• hdu 1518 Square 深搜,,,,花样剪枝啊!!!


    Square

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


    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
     
    開始就理解错题意了
    o(╯□╰)o 为什么我总是理解错题意
    题目的意思是全部的木棍能否组成一个正方形,而我觉得全部木棍中的一部分能否够构成一个正方形。。

    一直都是TLE,,我是枚举了全部的正方形可能的长度,然后进行深搜。

    。。

    后来看了别人的代码才返现是自己理解错了。
    即使题目意思明确了。我还是TLE一次。。原因是我反复搜索了。。
    代码:
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std ;
    
    int d[30] , m , sum = 0;
    bool visited[30] ;
    bool DFS(int len , int c ,int pos)
    {
    	if(c==4)
    	{
    		return true ;
    	}
    	if(sum == len)
    	{
    		if(DFS(0,c+1,0))
    		{
    			return true ;
    		}
    	}
    	else
    	{
    		for(int i = pos ; i < m ; ++i)
    		{
    			if(!visited[i])
    			{
    				if(len+d[i]>sum)
    				{
    					return false; 
    				}
    				visited[i] = true ;
    				if(DFS(len+d[i],c,i+1))
    				{
    					return true ;
    				}
    				visited[i] = false ;
    			}
    		}
    	}
    	return false ;
    }
    
    int main()
    {
    	int n ;
    	scanf("%d",&n);
    	while(n--)
    	{
    		scanf("%d",&m);
    		sum = 0 ;
    		for(int i = 0 ; i < m ; ++i)
    		{
    			scanf("%d",&d[i]) ;
    			sum += d[i] ;
    		}
    		if(m<4 || sum%4!=0)
    		{
    			puts("no") ;
    		}
    		else
    		{
    			sort(d,d+m) ;
    			sum /= 4 ;
    			if(sum<d[m-1])
    			{
    				puts("no") ;
    				continue ;
    			}
    			memset(visited,false,sizeof(visited)) ;
    			if( DFS(0,0,0) )
    			{
    				puts("yes") ;
    			}
    			else
    			{
    				puts("no") ;
    			}
    		}
    	}
    	return 0 ;
    }


  • 相关阅读:
    谷歌开发调试工具
    由form表单来说说前后台数据之间的交互
    ajax的post和get请求的使用
    css各属性的理解
    Http Servlet详解及学习地址
    表单详细解释
    JS正则表达式
    jQuery-AJAX简介
    POJ1008 Maya Calendar
    关于Code Blocks无编译器版本及VC6.0插入、打开报错
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6993617.html
Copyright © 2020-2023  润新知