usaco Chapter 1 Section 5

1. 数字三角形,POJ1163,不多说。

code:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<fstream>
#include<cstdlib>
#include<memory>
#include<algorithm>
#define read            freopen("numtri.in", "r", stdin)
#define write           freopen("numtri.out", "w", stdout)
#define rd              ifstream cout("numtri.out") ;
#define wt              ifstream cin("numtri.in") ;
#define max(a, b)       a>b?a:b
int data[ 1001][ 1001] ;
int main(){
    read ;
    write ;
     int i, j, n ;
    scanf( " %d ", &n) ;
     for(i= 0; i<n; i++)
         for(j= 0; j<=i; j++)
            scanf( " %d ", &data[i][j]) ;
     for(i=n- 2; i>= 0; i--)
         for(j= 0; j<=i; j++)
            data[i][j] += max(data[i+ 1][j], data[i+ 1][j+ 1]) ;
    printf( " %d\n ", data[ 0][ 0]) ;
     return  0 ;} 

 

 2. 这题打素数表显然不可能了,所以要得到回文数字。两种方法:

(1) 5..10000000依次判断是否为回文,当然中间可以跳过很多,比如偶数,比如除11外的长度为偶数的。

(2) 直接生成所有长度为奇数的回文奇数再加上11。

 先用第一种写的,写完加了各种优化各种剪枝,代码跟脓一样了还是个超时。第二种就好多了,虽然代码难看点但是效率挺高。最慢0.03

code:

#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include< string>
#include<fstream>
#define read            freopen("pprime.in", "r", stdin)
#define write           freopen("pprime.out", "w", stdout)
#define rd              ifstream cout("pprime.out") ;
#define wt              ifstream cin("pprime.in") ;
int cnt, pa[ 1000001] ;
void get_palin(){
     int i, j, k, l, g ;
    cnt =  0 ;
    pa[cnt++] =  5 ;
    pa[cnt++] =  7 ;
    pa[cnt++] =  11 ;
     for(i= 1; i< 10; i+= 2)
     for(j= 0; j< 10; j++)
        pa[cnt++] =  100*i+i+ 10*j ;
     for(i= 1; i< 10; i+= 2)
     for(j= 0; j< 10; j++)
     for(k= 0; k< 10; k++)
        pa[cnt++] =  10000*i+i+ 1000*j+ 10*j+ 100*k ;
     for(i= 1; i< 10; i+= 2)
     for(j= 0; j< 10; j++)
     for(k= 0; k< 10; k++)
     for(l= 0; l< 10; l++)
        pa[cnt++] =  1000000*i+i+ 100000*j+ 10*j+ 10000*k+ 100*k+ 1000*l ;
}
int is_prim( int a){
     for( int i= 2; i<=sqrt(a); i++)
         if(a%i== 0)   return  0 ;
     return  1 ;
}
int main(){
    read ;
    write ;
     int i, n, m ;
    scanf( " %d%d ", &n, &m) ;
    get_palin() ;
     for(i= 0; i<cnt ;i++){
         if(pa[i]<n||pa[i]>m||!is_prim(pa[i]))  continue ;
        printf( " %d\n ", pa[i]) ;
    }
     return  0 ;
}

 

3. 跟上一题一样也是直接生成,可以递归实现,我写成for的形式了。

 code:

#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include< string>
#include<fstream>
#define read            freopen("sprime.in", "r", stdin)
#define write           freopen("sprime.out", "w", stdout)
#define rd              ifstream cout("sprime.out") ;
#define wt              ifstream cin("sprime.in") ;
int ans[ 10][ 100001], cnt[ 11] ;
int is_prim( int a){
     for( int i= 2; i<=sqrt(a); i++)
         if(a%i== 0)   return  0 ;
     return  1 ;
}
int main(){
    read ;
    write ;
     int n, i, j, k ;
    scanf( " %d ", &n) ;
    memset(cnt,  0sizeof(cnt)) ;
    cnt[ 1] =  4 ;
    ans[ 1][ 0] =  2, ans[ 1][ 1] =  3, ans[ 1][ 2] =  5, ans[ 1][ 3] =  7 ;
     for(i= 2; i< 9; i++)
     for(k= 0; k<cnt[i- 1]; k++)
     for(j= 1; j< 10; j+= 2){
         int t = ans[i- 1][k] *  10 + j ;
         if(is_prim(t))  ans[i][cnt[i]++] = t ;
    }
     for(i= 0; i<cnt[n]; i++)
        printf( " %d\n ", ans[n][i]) ;
     return  0 ;} 

 

4. 八皇后,dfs+回溯。

code:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<fstream>
#include<cstdlib>
#include<memory>
#include<algorithm>
#define read    freopen("checker.in", "r", stdin)
#define write   freopen("checker.out", "w", stdout)
#define rd      ifstream cout("checker.out") ;
#define wt      ifstream cin("checker.in") ;
int n, c[ 15], d1[ 30], d2[ 30], ans[ 15], cnt ;
void print(){
     int i ;
     for(i= 1; i<n; i++)
        printf( " %d  ", ans[i]) ;
    printf( " %d\n ", ans[i]) ;
}
void dfs( int r){
     if(r==n+ 1){
        cnt ++ ;
         if(cnt< 4)
            print() ;
         return ;
    }
     for( int i= 1; i<=n; i++){
         if(c[i]||d1[r+i]||d2[r-i+n])     continue ;
        c[i] =  1 ;
        d1[r+i] =  1 ;
        d2[r-i+n] =  1 ;
        ans[r] = i ;
        dfs(r+ 1) ;
        c[i] =  0 ;
        d1[r+i] =  0 ;
        d2[r-i+n] =  0 ;
    }
}
int main(){
    read ;
    write ;
    scanf( " %d ", &n) ;
    memset(c,  0sizeof(c)) ;
    memset(d1,  0sizeof(d1)) ;
    memset(d2,  0sizeof(d2)) ;
    cnt =  0 ;
    dfs( 1) ;
    printf( " %d\n ", cnt) ;
     return   0 ;} 

你可能感兴趣的:(USACO)