zoukankan      html  css  js  c++  java
  • HDU-1518 Square(DFS)

                                         Square

    Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
    Total Submission(s) : 20   Accepted Submission(s) : 12

    Font: Times New Roman | Verdana | Georgia

    Font Size:  

    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
    

    Source

    University of Waterloo Local Contest 2002.09.21

    此题需要优化时间,避免超时。。优化时间技巧可以学习。。。。。。。。。

     1 #include <stdio.h>
     2 #include<string.h>
     3 int a[10000];
     4 int vist[10000];
     5 int sum;
     6 int l;
     7 int n;
     8 int flag;
     9 void Dfs(int t, int len, int index)
    10 {
    11     
    12 
    13     if (t == 5)
    14     {
    15         flag = 1;
    16         return ;
    17     }
    18 
    19     if (len == l)
    20     {
    21         Dfs(t + 1, 0, 0);
    22         if (flag)//优化时间
    23         {
    24             return ;
    25         }
    26     }
    27 
    28     for (int i = index; i < n; i++)//从index开始优化时间
    29     {
    30         if (vist[i]==0 && a[i] + len <= l)
    31         {
    32             vist[i] = 1;
    33             Dfs(t, a[i] + len, i + 1);
    34             if (flag)//优化时间
    35             {
    36                 return;
    37             }
    38             vist[i] = 0;
    39         }
    40     }
    41 }
    42 
    43 int main()
    44 {
    45     int i,t;
    46     scanf("%d", &t);
    47     while (t--)
    48     {
    49         
    50         sum = 0;
    51         scanf("%d", &n);
    52         for (int i = 0; i < n; i++)
    53         {
    54             scanf("%d", &a[i]);
    55             sum += a[i];
    56         }
    57         
    58         if (sum % 4 != 0)//简答的优化
    59         {
    60             puts("no");
    61             continue;
    62         }
    63 
    64 
    65         l = sum / 4;
    66 
    67        
    68         for (i = 0; i < n; i++)//有比边长大的边就不行
    69         {
    70             if (a[i] > l)
    71             {
    72                 break;
    73             }
    74         }
    75         if (i != n)
    76         {
    77             puts("no");
    78             continue;
    79         }
    80        memset(vist, 0, sizeof(vist));
    81         flag = 0;
    82         Dfs(1, 0, 0);
    83         if (flag)
    84         {
    85             puts("yes");
    86         }
    87         else
    88         {
    89             puts("no");
    90         }
    91     }
    92     return 0;
    93 }
  • 相关阅读:
    NSData
    Local declaration of 'content' hides instance variable
    【转】关于ObjectiveC 2.0 的垃圾收集
    【转】ObjectiveC 2.0之前需要了解的:关于ObjC内存管理的规则
    【转】谈ObjC对象的两段构造模式
    [转]苹果开发工具XCode教学:用Instruments解决内存泄露
    【转】NSMutableArray的正确使用
    【转】UIAlertView使用小结
    pad点餐系统重构原则
    'initWithFrame:reuseIdentifier:' is deprecated
  • 原文地址:https://www.cnblogs.com/cancangood/p/3278886.html
Copyright © 2011-2022 走看看