我希望你是我独家记忆

一段永远封存的记忆,随风而去
posts - 263, comments - 31, trackbacks - 0, articles - 3
   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理

USACO——424——DFS

Posted on 2008-08-07 19:36 Hero 阅读(163) 评论(0)  编辑 收藏 引用 所属分类: 代码如诗--ACM
/*
ID: wangzha4
LANG: C++
TASK: cowcycle
*/

/*
   Test 1: TEST OK [0.011 secs, 2724 KB]
   Test 2: TEST OK [0.151 secs, 2720 KB]
   Test 3: TEST OK [0.205 secs, 2720 KB]
   Test 4: TEST OK [0.421 secs, 2720 KB]
   Test 5: TEST OK [0.713 secs, 2720 KB]
   Test 6: TEST OK [0.799 secs, 2720 KB]
   Test 7: TEST OK [1.544 secs, 2724 KB]
   Test 8: TEST OK [1.361 secs, 2720 KB]
*/

//1. 小数据用简单排序,不要用qsort,会超时
//2. 在判断的时候乘法比除法快
//3. DFS的时候在递归结束的时候一定不要忘了return
//4. 重复第三条

#include 
<stdio.h>
#include 
<stdlib.h>
#include 
<string.h>
#include 
<ctype.h>
#define llong unsigned long long 
#define unint unsigned int
#define printline  printf( "\n" ) 

const int INF = 1000000 ;
const int size = 155 ;

int inf, inb ;
int fsn, fen, bsn, ben ;
int front[size], back[size] ;
double rate[160] ; int ct_rate ;
double data[160] ; 

double best ;
int bfront[size], bback[size] ;

int cmp( const void *a, const void *b )
{
    
if*(double *)a - *(double *)b > 0 )    return 1 ;
    
else    return -1 ;
}

void DFS_back( int dep, int tdep, int sn )
{
    
if( sn > ben )    return ;
    
    back[dep] 
= sn ;
    
    
if( dep == inb ) {
        
//if( front[inf]*1.0/back[1] - front[1]*1.0/back[inb] * 3.0 < 0 )    return ;
        if( front[inf] * back[inb] < back[1* front[1* 3 )    return ;
        
        ct_rate 
= 0 ;
        
forint i=1; i<=inf; i++ ) {
            
forint j=1; j<=inb; j++ ) {
                rate[ct_rate
++= front[i]*1.0 / back[j] ;
            }
        }
        
//qsort( rate, ct_rate, sizeof(rate[0]), cmp ) ;
        
        
double temp ; 
        
forint i=ct_rate-1; i>0; i-- ) {
            
forint j=0; j<i; j++ ) {
                
if( rate[j+1< rate[j] ) {
                    temp 
= rate[j] ; rate[j] = rate[j+1]; rate[j+1= temp ;
                }
            }
        }
        
        
double fangcha = 0.0 ; double average = 0.0 ; double sum = 0.0 ;
        
forint i=1; i<ct_rate; i++ ) {
            data[i] 
= rate[i] - rate[i-1] ;    sum += data[i] ;
        }
        average 
= sum / (ct_rate-1) ;
        
forint i=1; i<ct_rate; i++ ) {
            fangcha 
+= (average-data[i]) * (average-data[i]) ;
        }
        
        fangcha 
= fangcha / (ct_rate-1) ;
        
        
if( fangcha < best ) {
            
forint i=1; i<=inf; i++ )    bfront[i] = front[i] ;
            
forint i=1; i<=inb; i++ )    bback[i]  = back[i] ;
            best 
= fangcha ;
        }

        
return ;
    }
    
    
int maxi = ben - inb + dep + 1 ;
    
forint i=1; i+sn<=maxi; i++ ) {
        DFS_back( dep
+1, tdep, sn+i ) ;
    }
}

void DFS_front( int dep, int tdep, int sn )
{
    
if( sn > fen )    return ;
    
    front[dep] 
= sn ;
    
    
if( dep == inf ) {
        
forint j=bsn; j<=ben-inb+1; j++ ) {
            DFS_back( 
1, inb, j ) ;
        }

        
return ;
    }
    
    
int maxi = fen - inf + dep + 1 ;
    
forint i=1; i+sn<=maxi; i++ ) {
        DFS_front( dep
+1, tdep, sn+i ) ;
    }
}

int main()
{
    freopen( 
"cowcycle.in""r", stdin ) ;
    freopen( 
"cowcycle.out","w",stdout ) ;

    scanf( 
"%d %d"&inf, &inb ) ;
    scanf( 
"%d %d %d %d"&fsn, &fen, &bsn,&ben ) ;
    
    best 
= (double)INF ;
    
forint i=fsn; i<=fen-inf+1; i++ )
        DFS_front( 
1, inf, i ) ;
    
    
forint i=1; i<inf; i++ )    printf( "%d ", bfront[i] ) ; printf( "%d\n", bfront[inf] ) ;
    
forint i=1; i<inb; i++ )    printf( "%d ", bback[i] ) ; printf( "%d\n", bback[inb] ) ;
    
    
return 0 ;
}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理