zoukankan      html  css  js  c++  java
  • 蓝桥杯省赛备战笔记—— (五)快速提升代码能力———练习题

    例题:矩阵旋转

    给出一个n X m的整数矩阵,请你把这个矩阵顺
    时针旋转90°以后输出。
    输入格式
    第- -行输入两个整数n,m(1 < n,m≤200),
    用空格隔开。
    接下来n行,每行输入m个整数,表示输入的矩
    阵。矩阵中元素都是int范围内的整数。
    输出格式
    输入m行,每行n个空格隔开的整数,表示旋转
    以后的矩阵。注意:每行末尾不能输出多余的空
    格。

    #include<stdio.h>
    int a[205][205];
    int main(){
        int n,m;
        scanf("%d %d",&n,&m);
        for(int i = 0; i< n;i++){
            for(int j = 0;j < m;j++){
                scanf("%d",&a[i][j]);
            }
        }
        for(int i = 0;i < m;i++){
            for(int j = 0 ;j < n;j++){
                if(j != n-1){
                    printf("%d ",a[n - 1 - j][i]);
                }else{
                    printf("%d
    ",a[n - 1 - j][i]);
                }
            }
        }
        return 0;
    }

     例题:最大子阵

    #include<stdio.h>
    int a[55][55];
    int main(){
        int n,m;
        scanf("%d %d",&n,&m);
        for(int i = 0; i< n;i++){
            for(int j = 0;j < m;j++){
                scanf("%d",&a[i][j]);
            }
        }
        int ans = -1005;
        for(int up = 0;up < n;up++){
            for(int down = up;down < n;down++){
                for(int left = 0;left < m;left++){
                    for(int right = left;right < m;right++){
                        int tmp = 0;
                        for(int p = up;p <= down;p++){
                            for(int q = left ;q <= right;q++){
                                tmp += a[p][q];
                            }
                        }
                        if(tmp > ans)
                            ans = tmp;
                    }
                }
            }
        }
        printf("%d",ans);
        return 0;
    }

     例题:蒜头君的随机数

    蒜头君想在学校中请一些同学- 起做一 项问卷调
    查,为了确保实验的客观性,他先用计算机生成了
    n(1≤n≤100) 个1到1000之间的随机整
    数,对于其中重复的数字,只保留一一个,把其余相
    同的数去掉,不同的数对应着不同的学生的学号。
    然后再把这些数从小到大排序,按照排好的顺序去
    找同学做调查。
    请你协助蒜头君完成“去重”与“排序” 的工作。
    输入格式
    共两行,第- -行为一个正整数n。
    第二行有n个用空格隔开的正整数,为所产生的随
    机数。
    输出格式

    第一行输出一一个正整数m,表示不相同的随机数的
    个数。第二行输出m个用空格隔开的正整数,为
    从小到大排好序的不相同的随机数。

     

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int a[1005] = {0};
    int main(){
        int n,m;
        scanf("%d",&n);
        int c = 0;
        for(int i = 0; i < n;i++){
            scanf("%d",&m);
            if(a[m] == 1){
                c++;
            }else{
                a[m] = 1;
            }
        }
        printf("%d
    ",n-c);
        int f = 0;
        for(int i = 0 ;i < 1005;i++){
            if(a[i] == 1){
                if(f)
                    printf(" %d",i);
                else{
                    printf("%d",i);
                    f = 1;
                }
            }
        }
        return 0;
    }

     例题:交叉排序

    蒜头君很无聊,现在有N个数,其中第
    i(1≤i≤N)个数是Ai。

    请输出A排序后的最终结果。
    输入格式
    第一行五个整数
    N,l1,r1,l2,r2(l1 <r1,l2 < r2),均不超过
    100000。
    第二行N个不超过int范围的整数,表示A数
    组。
    输出格式

    -行N个用空格分隔的整数,表示A排序以后的
    结果。
    样例输入
    6 1 3 2 4
    8 3 1 6 9 2
    样例输出

    1 8 6 3 9 2

    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    int a[10005];
    int main(){
        int n,l1,r1,l2,r2;
        scanf("%d %d %d %d %d",&n,&l1,&r1,&l2,&r2);
        for(int i = 1; i <= n;i++){
            scanf("%d",&a[i]);
        }
        sort(a+l1,a+r1+1);
        sort(a+l2,a+r2+1,greater<int>());
        int f = 0;
        for(int i = 1 ;i <= n;i++){
            if(f)
                printf(" %d",a[i]);
            else{
                printf("%d",a[i]);
                f = 1;
            }
        }
        return 0;
    }

     例题:进制转换

     输出: 1B

    #include<stdio.h>
    char a[105];
    int main(){
        int n,r;
        scanf("%d %d",&n,&r);    
        if(n < 0){
            n = - n;
            printf("-");
        }
        int m = 0;
        int now;
        while(n){
            now = n % r;
            if(now <= 9){
                a[m] = now + '0';
            }else{
                a[m] = now - 10 + 'A'; 
            }
            n /= r;
            m++;
        }
        if(m == 0)
            printf("0");
        for(int i = m -1 ;i >= 0;i--){
            printf("%c",a[i]);
        }
        return 0;
    }

     例题:回文数

    -个正整数,如果交换高低位以后和原数相等,那
    么称这个数为回文数。比如121,2332都是回文
    数,13, 4567不是回文数。
    任意-个正整数,如果其不是回文数,将该数交换
    高低位以后和原数相加得到一个新的数,如果新数
    不是回文数,重复这个变换,直到得到一个回文数
    为止。例如,57变换后得到132(57 + 75),132
    得到363(132 + 231),363是一个回文数。
    曾经有数学家猜想:对于任意正整数,经过有限次
    上述变换以后,- -定能得出一个回文数。至今这个
    猜想还没有被证明是对的。现在请你通过程序来验
    证。
    输入格式
    输入-行-一个正整数n.

    输出格式
    输出第一行-一个正整数,表示得到-个回文数的最
    少变换次数。
    接下来一行,输出变换过程,相邻的数之间
    用"--->”连接。输出格式可以参见样例。
    保证最后生成的数在int范围内。

     

    #include<stdio.h>
    int num[105];
    int dig[105];
    bool judge(int x){   //判断是否回文数
        int cnt = 0;
        while(x){
            dig[cnt++] = x % 10;
            x /= 10;
        }
        for(int i = 0; i< cnt /2;i++){
            if(dig[i] != dig[cnt - 1 - i]){
                return false;
            }
        }
        return true;
    }
    int rev(int x){  // 反转函数
        int ret = 0;
        while(x){
            ret = ret * 10 + x % 10;
            x /= 10;
        }
        return ret;
    }
    int main(){
        int n,m;
        scanf("%d",&n);
        m = 0;
        num[m++] = n;
        while(!judge(n)){
            n += rev(n);
            num[m++] = n;
        }
        printf("%d
    ",m - 1);
        for(int i = 0;i < m;i++){
            if(i != m - 1){
                printf("%d--->",num[i]);
            }else{
                printf("%d",num[i]);
            }
        }
        return 0;
    }

    例题:机器人

     

    输入格式
    第一行输入-个整数n(1≤n≤100)表示指令
    的个数。
    接下里n行,每行输入形如上面的指令,其中
    -.1000<x<1000。
    输出格式
    输出两个整数x, y表示机器人最后坐标。用空格
    隔开。

    样例输入
    10
    back -9
    left 3
    left 8
    back 15
    right 10
    right -7
    right -3
    left 11
    right 17
    left 3
    样例输出
    9 -7

    #include<stdio.h>
    int dx[4] = {0,-1,0,1};//forward  left back  right  
    int dy[4] = {1,0,-1,0};
    char a[15]; //op
    int main(){
        int n,d,x;
        scanf("%d",&n);
        int nowx = 0;
        int nowy = 0;
        d = 3; //初始所朝的方向【假定:当命令为forward 时,x坐标+1,y坐标不变,显然是dx[3],dy[3]分别代表的 1 0】 
        while(n--){
            scanf("%s %d",a,&x);
            if(a[0] == 'b'){
                d = (d + 2) % 4; //当前的方向d,指 下一条指令为 forward n时,x,y坐标的加减变化,对于与dx[4],dy[4]的 +/-/0 ---- 加/减/不变 
            }else if(a[0] == 'l'){ //方便计算当前的坐标nowx nowy 
                d = (d + 1) % 4;
            }else if(a[0] == 'r'){
                d = ( d + 3) % 4;
            }
            nowx += dx[d] * x;
            nowy += dy[d] * x;
        }
        printf("%d %d",nowx,nowy);
        return 0;
    }
  • 相关阅读:
    [转]asp.net页面缓存技术
    UL和LI在div中的高度的IE6下兼容性
    jquery制作的横向图片滚动带横向滚动条TackerScroll
    电脑可以上网,但是qq登陆不上去?
    Introduction to discrete event system学习笔记4.6
    Introduction to Discrete event system学习笔记4.9
    Introduction to discrete event systemsstudy 4.5
    Symbolic synthesis of obserability requirements for diagnosability B.Bittner,M.Bozzano,A.Cimatti,and X.Olive笔记4.16
    Introduction to discrete event system学习笔记4.8pm
    Introduction to discrete event system学习笔记 4.8
  • 原文地址:https://www.cnblogs.com/expedition/p/12330848.html
Copyright © 2011-2022 走看看