现在的位置: 首页 > 综合 > 正文

usaco Chapter 1 Section 5

2013年03月10日 ⁄ 综合 ⁄ 共 4038字 ⁄ 字号 评论关闭

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 ;} 

抱歉!评论已关闭.