• 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 ;} 
  • 相关阅读:
    Lucene 02
    企业级-Shell案例5——找出占用CPU 内存过高的进程
    企业级-Shell案例4——一键查看服务器利用率
    企业级-Shell案例3——批量创建多个用户并设置密码
    企业级-Shell案例2——发送告警邮件
    企业级-Shell案例1——服务器系统配置初始化
    Centos搭建docker swarm集群详细教程
    Promethus(普罗米修斯)的Grafana+onealert实现报警功能
    Promethus的Grafana图形显示MySQL监控数据
    Promethus(普罗米修斯)安装Grafana可视化图形工具
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2515135.html
Copyright © 2020-2023  润新知