• UVa 1377 / LA 3667 Ruler


    之前WA是被这组数据卡掉了:

    4

    5 15 25 35

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <cstdlib>
      4 #include <queue>
      5 #include <algorithm>
      6 
      7 using namespace std;
      8 
      9 struct node
     10 {
     11     int Haash;
     12     int use[8];
     13     int count;
     14 };
     15 
     16 
     17 bool vis[ (1 << 22) + 10 ];
     18 int d[54];
     19 int n, cnt;
     20 int idx[1000100];
     21 
     22 bool check( int a, int cur )
     23 {
     24     for ( int i = 0; i < cur; ++i )
     25         if ( d[i] == a ) return false;
     26     return true;
     27 }
     28 
     29 bool IfEnd( int a )
     30 {
     31     //printf( "all = %d\n", ( 1 << cnt ) - 1 );
     32     if ( a == (1 << cnt) - 1 ) return true;
     33     return false;
     34 }
     35 
     36 void chuli( node &cur, int add )
     37 {
     38     for ( int i = 0; i < cur.count; ++i )
     39     {
     40         int c = abs( add - cur.use[i] );
     41         if ( idx[c] != -1 ) cur.Haash |= ( 1 << idx[c] );
     42     }
     43 
     44     cur.use[ cur.count++ ] = add;
     45 
     46     sort( cur.use, cur.use + cur.count );
     47 
     48     return;
     49 }
     50 
     51 bool IfSame( int *num, int nn, int tar )
     52 {
     53     for ( int i = 0; i < nn; ++i )
     54         if ( num[i] == tar ) return true;
     55 
     56     return false;
     57 }
     58 
     59 node BFS()
     60 {
     61     memset( vis, false, sizeof(vis) );
     62     queue<node> Q;
     63 
     64     node st;
     65     st.Haash = 1;
     66     st.count = 1;
     67     st.use[0] = 0;
     68     vis[ st.Haash ] = true;
     69     Q.push( st );
     70 
     71     while ( !Q.empty() )
     72     {
     73         node cur = Q.front();
     74         Q.pop();
     75         //printf( "cnt=%d last=%d hash=%d\n", cur.count, cur.last, cur.Haash );
     76         if ( IfEnd( cur.Haash ) ) return cur;
     77 
     78         for ( int i = 0; i < cur.count; ++i )
     79         {
     80             for ( int j = 0; j < cnt; ++j )
     81             {
     82                 if ( cur.Haash & ( 1 << j ) ) continue;
     83 
     84                 int x = cur.use[i] + d[j];
     85                 if ( IfSame( cur.use, cur.count, x ) || x > d[ cnt - 1 ] ) continue;
     86 
     87                 node temp = cur;
     88                 chuli( temp, x );
     89 
     90                 if ( !vis[ temp.Haash ] )
     91                 {
     92                     vis[ temp.Haash ] = true;
     93                     if ( IfEnd( temp.Haash ) ) return temp;
     94 
     95                     Q.push(temp);
     96                 }
     97             }
     98 
     99             for ( int j = 0; j < cnt; ++j )
    100             {
    101                 if ( cur.Haash & ( 1 << j ) ) continue;
    102 
    103                 int x = cur.use[i] - d[j];
    104                 if ( IfSame( cur.use, cur.count, x ) || x > d[ cnt - 1 ] || x < 0 ) continue;
    105 
    106                 node temp = cur;
    107                 chuli( temp, x );
    108 
    109                 if ( !vis[ temp.Haash ] )
    110                 {
    111                     vis[ temp.Haash ] = true;
    112                     if ( IfEnd( temp.Haash ) ) return temp;
    113 
    114                     Q.push(temp);
    115                 }
    116             }
    117         }
    118     }
    119 
    120     return st;
    121 }
    122 
    123 int main()
    124 {
    125     int cas = 0;
    126     while ( scanf( "%d", &n ), n )
    127     {
    128         d[0] = 0;
    129         cnt = 1;
    130         for ( int i = 0; i < n; ++i )
    131         {
    132             int a;
    133             scanf( "%d", &a );
    134             if ( check( a, cnt ) ) d[ cnt++ ] = a;
    135         }
    136         sort( d, d + cnt );
    137 
    138         memset( idx, -1, sizeof(idx) );
    139         for ( int i = 0; i < cnt; ++i ) idx[ d[i] ] = i;
    140 
    141         node ans = BFS();
    142 
    143         printf( "Case %d:\n", ++cas );
    144         printf( "%d\n", ans.count );
    145         for ( int i = 0; i < ans.count; ++i )
    146         {
    147             if ( i ) putchar(' ');
    148             printf( "%d", ans.use[i] );
    149         }
    150         puts("");
    151     }
    152     return 0;
    153 }
  • 相关阅读:
    css文本及文本装饰
    css尺寸常用样式
    了解css的两大特性
    css长度单位及字体
    css颜色
    css选择器详解
    了解css
    html行级元素与块级元素以及meta标签的使用
    了解html表单
    html图片和html实体
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/3109919.html
Copyright © 2020-2023  润新知