• 第六届CCF软件能力认证


    1.数位之和

    问题描述
      给定一个十进制整数n,输出n的各位数字之和。
    输入格式
      输入一个整数n。
    输出格式
      输出一个整数,表示答案。
    样例输入
    20151220
    样例输出
    13
    样例说明
      20151220的各位数字之和为2+0+1+5+1+2+2+0=13。
    评测用例规模与约定
      所有评测用例满足:0 ≤ n ≤ 1000000000。
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<string>
     5 using namespace std;
     6 
     7 
     8 
     9 int main(){
    10     string n ;
    11     cin>>n ;
    12     int i ;
    13     int sum = 0 ;
    14     for (i = 0 ; i < n.size() ; i++){
    15         sum += (n[i] - '0') ;
    16     }
    17     printf("%d
    " , sum) ;
    18 
    19 
    20     return 0 ;
    21 }
    View Code

    2.消除类游戏

    问题描述
      消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。
      现在给你一个n行m列的棋盘,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。
      请注意:一个棋子可能在某一行和某一列同时被消除。
    输入格式
      输入的第一行包含两个整数n, m,用空格分隔,分别表示棋盘的行数和列数。
      接下来n行,每行m个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。颜色使用1至9编号。
    输出格式
      输出n行,每行m个整数,相邻的整数之间使用一个空格分隔,表示经过一次消除后的棋盘。如果一个方格中的棋子被消除,则对应的方格输出0,否则输出棋子的颜色编号。
    样例输入
    4 5
    2 2 3 1 2
    3 4 5 1 4
    2 3 2 1 3
    2 2 2 4 4
    样例输出
    2 2 3 0 2
    3 4 5 0 4
    2 3 2 0 3
    0 0 0 4 4
    样例说明
      棋盘中第4列的1和第4行的2可以被消除,其他的方格中的棋子均保留。
    样例输入
    4 5
    2 2 3 1 2
    3 1 1 1 1
    2 3 2 1 3
    2 2 3 3 3
    样例输出
    2 2 3 0 2
    3 0 0 0 0
    2 3 2 0 3
    2 2 0 0 0
    样例说明
      棋盘中所有的1以及最后一行的3可以被同时消除,其他的方格中的棋子均保留。
    评测用例规模与约定
      所有的评测用例满足:1 ≤ n, m ≤ 30。
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<string>
     5 using namespace std;
     6 
     7 
     8 
     9 int main(){
    10     //freopen("in.txt","r",stdin) ;
    11     int a[40][40] ;
    12     int b[40][40] ;
    13     int n , m ;
    14     scanf("%d %d" , &n , &m) ;
    15     int i , j ;
    16     for (i = 0 ; i < n ; i++){
    17         for(j = 0 ; j < m ; j++){
    18             scanf("%d" , &a[i][j]) ;
    19             b[i][j] = a[i][j] ;
    20         }
    21     }
    22 
    23     for (i = 0 ; i < n ; i++){
    24         for(j = 0 ; j < m ; j++){
    25             if(j >= (m-2))
    26                continue ;
    27             int t = a[i][j] ;
    28             int k = j ;
    29             if (t == a[i][k+1]){
    30                 int sum = 2 ;
    31                 while(a[i][k+2] == t){
    32                     sum++ ;
    33                     k++ ;
    34                 }
    35                 if (sum >= 3){
    36                     for(int l = 0 ; l < sum ; l++){
    37                         a[i][j+l] = 0 ;
    38                     }
    39                 }
    40             }
    41 
    42         }
    43     }
    44 
    45     for(j = 0 ; j < m ; j++){
    46         for (i = 0 ; i < n ; i++){
    47             if(i >= (n-2))
    48                continue ;
    49             int t = b[i][j] ;
    50             int k = i ;
    51             if (t == b[k+1][j]){
    52                 int sum = 2 ;
    53                 while(b[k+2][j] == t){
    54                     sum++ ;
    55                     k++ ;
    56                 }
    57                 if (sum >= 3){
    58                     for(int l = 0 ; l < sum ; l++){
    59                         b[i+l][j] = 0 ;
    60                     }
    61                 }
    62             }
    63 
    64         }
    65     }
    66 
    67     for (i = 0 ; i < n ; i++){
    68         for(j = 0 ; j < m ; j++){
    69             if(b[i][j] == 0)
    70                 a[i][j] = 0 ;
    71             printf("%d " , a[i][j]) ;
    72         }
    73         printf("
    ") ;
    74     }
    75 
    76 
    77     return 0 ;
    78 }
    View Code

    3.画图

    问题描述
      用 ASCII 字符来画图是一件有趣的事情,并形成了一门被称为 ASCII Art 的艺术。例如,下图是用 ASCII 字符画出来的 CSPRO 字样。
      ..____.____..____..____...___..
      ./.___/.___||.._.|.._../._..
      |.|...\___.|.|_).|.|_).|.|.|.|
      |.|___.___).|..__/|.._.<|.|_|.|
      .\____|____/|_|...|_|.\_\___/.
      本题要求编程实现一个用 ASCII 字符来画图的程序,支持以下两种操作:
      Ÿ 画线:给出两个端点的坐标,画一条连接这两个端点的线段。简便起见题目保证要画的每条线段都是水平或者竖直的。水平线段用字符 - 来画,竖直线段用字符 | 来画。如果一条水平线段和一条竖直线段在某个位置相交,则相交位置用字符 + 代替。
      Ÿ 填充:给出填充的起始位置坐标和需要填充的字符,从起始位置开始,用该字符填充相邻位置,直到遇到画布边缘或已经画好的线段。注意这里的相邻位置只需要考虑上下左右 4 个方向,如下图所示,字符 @ 只和 4 个字符 * 相邻。
      .*.
      *@*
      .*.
    输入格式
      第1行有三个整数m, n和q。m和n分别表示画布的宽度和高度,以字符为单位。q表示画图操作的个数。
      第2行至第q + 1行,每行是以下两种形式之一:
      Ÿ 0 x1 y1 x2 y2:表示画线段的操作,(x1, y1)和(x2, y2)分别是线段的两端,满足要么x1 = x2 且y1 ≠ y2,要么 y1 = y2 且 x1 ≠ x2
      Ÿ 1 x y c:表示填充操作,(x, y)是起始位置,保证不会落在任何已有的线段上;c 为填充字符,是大小写字母。
      画布的左下角是坐标为 (0, 0) 的位置,向右为x坐标增大的方向,向上为y坐标增大的方向。这q个操作按照数据给出的顺序依次执行。画布最初时所有位置都是字符 .(小数点)。
    输出格式
      输出有n行,每行m个字符,表示依次执行这q个操作后得到的画图结果。
    样例输入
    4 2 3
    1 0 0 B
    0 1 0 2 0
    1 0 0 A
    样例输出
    AAAA
    A--A
    样例输入
    16 13 9
    0 3 1 12 1
    0 12 1 12 3
    0 12 3 6 3
    0 6 3 6 9
    0 6 9 12 9
    0 12 9 12 11
    0 12 11 3 11
    0 3 11 3 1
    1 4 2 C
    样例输出
    ................
    ...+--------+...
    ...|CCCCCCCC|...
    ...|CC+-----+...
    ...|CC|.........
    ...|CC|.........
    ...|CC|.........
    ...|CC|.........
    ...|CC|.........
    ...|CC+-----+...
    ...|CCCCCCCC|...
    ...+--------+...
    ................
    评测用例规模与约定
      所有的评测用例满足:2 ≤ m, n ≤ 100,0 ≤ q ≤ 100,0 ≤ x < m(x表示输入数据中所有位置的x坐标),0 ≤ y < n(y表示输入数据中所有位置的y坐标)。
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<string>
     5 using namespace std;
     6 
     7 int d[4][2] = {{0,1},{0,-1},{1,0},{-1,0} } ;
     8 char a[110][110] ;
     9 int n , m , q ;
    10 void dfs(int x , int y , char ch)
    11 {
    12     int fx , fy ;
    13     int i , j;
    14     a[x][y] = ch;
    15     for (i = 0 ; i < 4 ; i++)
    16     {
    17         fx = x + d[i][0] ;
    18         fy = y + d[i][1] ;
    19         if (fx<0 || fx>=n || fy<0 || fy>=m || a[fx][fy] == '-' || a[fx][fy] == '|' || a[fx][fy] == '+' || a[fx][fy] == ch)
    20         {
    21             continue;
    22         }
    23         a[fx][fy] = ch ;
    24 
    25         dfs(fx,fy,ch) ;
    26     }
    27     return ;
    28 }
    29 
    30 int main(){
    31    // freopen("in.txt","r",stdin) ;
    32 
    33     scanf("%d %d %d" , &m , &n , &q) ;
    34     int i , j ;
    35     for (i = 0 ; i < n ; i++){
    36         for(j = 0 ; j < m ; j++){
    37             a[i][j] = '.' ;
    38         }
    39     }
    40 
    41     while(q--){
    42         int op ;
    43         scanf("%d" , &op) ;
    44         if (op == 0){
    45             int x1 , y1 , x2 , y2 ;
    46             scanf("%d%d%d%d" , &y1 , &x1 , &y2 , &x2) ;
    47             //printf("%d %d %d %d
    " , y1 , x1 , y2 , x2) ;
    48             if(x1 == x2){
    49                 if (y1 > y2)
    50                    swap(y1 , y2) ;
    51                 for(int k = y1 ; k <= y2 ; k++){
    52                     if (a[x1][k] == '|' || a[x1][k] == '+')
    53                        a[x1][k] = '+' ;
    54                     else
    55                        a[x1][k] = '-' ;
    56                 }
    57             }
    58             else if(y1 == y2){
    59                 if (x1 > x2)
    60                    swap(x1 , x2) ;
    61                 for(int k = x1 ; k <= x2 ; k++){
    62                     if (a[k][y1] == '-' || a[x1][k] == '+')
    63                        a[k][y1] = '+' ;
    64                     else
    65                        a[k][y1] = '|' ;
    66                 }
    67             }
    68         }
    69         else{
    70             int x ,y ;
    71             char ch ;
    72             scanf("%d%d" ,&y , &x ) ;
    73             cin>>ch ;
    74             dfs(x,y,ch) ;
    75 
    76         }
    77     }
    78     for (i = n-1 ; i >= 0 ; i--){
    79         for(j = 0 ; j < m ; j++){
    80             printf("%c" , a[i][j]);
    81         }
    82         printf("
    ") ;
    83     }
    84 
    85 
    86 
    87 
    88 
    89     return 0 ;
    90 }
    View Code

    4.送货

    问题描述
      为了增加公司收入,F公司新开设了物流业务。由于F公司在业界的良好口碑,物流业务一开通即受到了消费者的欢迎,物流业务马上遍及了城市的每条街道。然而,F公司现在只安排了小明一个人负责所有街道的服务。
      任务虽然繁重,但是小明有足够的信心,他拿到了城市的地图,准备研究最好的方案。城市中有n个交叉路口,m条街道连接在这些交叉路口之间,每条街道的首尾都正好连接着一个交叉路口。除开街道的首尾端点,街道不会在其他位置与其他街道相交。每个交叉路口都至少连接着一条街道,有的交叉路口可能只连接着一条或两条街道。
      小明希望设计一个方案,从编号为1的交叉路口出发,每次必须沿街道去往街道另一端的路口,再从新的路口出发去往下一个路口,直到所有的街道都经过了正好一次。
    输入格式
      输入的第一行包含两个整数n, m,表示交叉路口的数量和街道的数量,交叉路口从1到n标号。
      接下来m行,每行两个整数a, b,表示和标号为a的交叉路口和标号为b的交叉路口之间有一条街道,街道是双向的,小明可以从任意一端走向另一端。两个路口之间最多有一条街道。
    输出格式
      如果小明可以经过每条街道正好一次,则输出一行包含m+1个整数p1, p2, p3, ..., pm+1,表示小明经过的路口的顺序,相邻两个整数之间用一个空格分隔。如果有多种方案满足条件,则输出字典序最小的一种方案,即首先保证p1最小,p1最小的前提下再保证p2最小,依此类推。
      如果不存在方案使得小明经过每条街道正好一次,则输出一个整数-1。
    样例输入
    4 5
    1 2
    1 3
    1 4
    2 4
    3 4
    样例输出
    1 2 4 1 3 4
    样例说明
      城市的地图和小明的路径如下图所示。
    样例输入
    4 6
    1 2
    1 3
    1 4
    2 4
    3 4
    2 3
    样例输出
    -1
    样例说明
      城市的地图如下图所示,不存在满足条件的路径。
    评测用例规模与约定
      前30%的评测用例满足:1 ≤ n ≤ 10, n-1 ≤ m ≤ 20。
      前50%的评测用例满足:1 ≤ n ≤ 100, n-1 ≤ m ≤ 10000。
      所有评测用例满足:1 ≤ n ≤ 10000,n-1 ≤ m ≤ 100000。
     
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<stack>
     4 #include<cstring>
     5 using namespace std;
     6 
     7 stack<int>S;
     8 const int MAXN=8010;
     9 int edge[MAXN][MAXN];
    10 int result[MAXN] ;
    11 int n,m;
    12 int l = 0 ;
    13 
    14 void dfs(int x){
    15     S.push(x);
    16     for(int i=1;i<=n;i++){
    17         if(edge[x][i]>0){
    18             edge[i][x]=edge[x][i]=0;//删除此边
    19             dfs(i);
    20             break;
    21         }
    22     }
    23 }
    24 
    25 //Fleury算法的实现
    26 void Fleury(int x){
    27     S.push(x);
    28     while(!S.empty()){
    29         int b=0;
    30         for(int i=1;i<=n;i++){
    31             if(edge[S.top()][i]>0){
    32                 b=1;
    33                 break;
    34             }
    35         }
    36         if(b==0){
    37             //printf("%d",S.top());
    38             result[l] = S.top() ;
    39             l++ ;
    40             S.pop();
    41         }else {
    42             int y=S.top();
    43             S.pop();
    44             dfs(y);//如果有,就dfs
    45         }
    46     }
    47    // printf("
    ");
    48 }
    49 
    50 int main(){
    51     //freopen("in.txt","r",stdin) ;
    52     scanf("%d%d",&n,&m); //读入顶点数以及边数
    53     memset(edge,0,sizeof(edge));
    54     int x,y;
    55     for(int i=1;i<=m;i++){
    56         scanf("%d%d",&x,&y);
    57         edge[x][y]=edge[y][x]=1;
    58     }
    59     //如果存在奇数顶点,则从奇数顶点出发,否则从顶点0出发
    60     int num=0,start=1;
    61     for(int i=n;i>=1;i--){                        //判断是否存在欧拉回路
    62         int degree=0;
    63         for(int j=n;j>=1;j--){
    64             degree+=edge[i][j];
    65         }
    66         if(degree&1){
    67             start=i,num++;
    68         }
    69     }
    70     if(num==0||num==2){
    71         Fleury(start);
    72         for(int i=l-1;i>=0;i--)
    73             printf("%d " , result[i]) ;
    74         printf("
    ") ;
    75     }else
    76         printf("-1
    ");
    77     return 0;
    78 }
    View Code

    5.矩阵

    问题描述
      创造一个世界只需要定义一个初状态和状态转移规则。
      宏观世界的物体运动规律始终跟物体当前的状态有关,也就是说只要知道物体足够多的状态信息,例如位置、速度等,我们就能知道物体之后任意时刻的状态。
      现在小M创造了一个简化的世界。
      这个世界中,时间是离散的,物理规律是线性的:世界的初始状态可以用一个m维向量b(0)表示,状态的转移方式用m×m的矩阵A表示。
      若已知这个世界当前的状态是b,那么下一时刻就等于b左乘状态转移矩阵A,即Ab。
      这个世界中,物体的状态也是离散的,也就是说可以用整数表示。再进一步,整数都可以用二进制编码拆分为有限位0和1。因此,这里的矩阵A和向量b的每个元素都是0或1,矩阵乘法中的加法运算视为异或运算(xor),乘法运算视为与运算(and)。
      具体地,设矩阵A第i行第j列的元素为ai, j,向量b的第i个元素为bi。那么乘法Ab所得的第k个元素为
      (ak,1 and b1) xor (ak,2 and b2) xor ⋯ xor (ak,m and bm)
      矩阵和矩阵的乘法也有类似的表达。
      小M发现,这样的矩阵运算也有乘法结合律,例如有A(Ab)=(AA)b=A2b。
      为了保证自己创造的世界维度不轻易下降,小M保证了矩阵A可逆,也就是说存在一个矩阵A-1,使得对任意向量d,都有A-1Ad=d。
      小M想了解自己创造的世界是否合理,他希望知道这个世界在不同时刻的状态。
      具体地,小M有n组询问,每组询问会给出一个非负整数k,小M希望你帮他求出Akb。
    输入格式
      输入第一行包含一个整数m,表示矩阵和向量的规模。
      接下来m行,每行包含一个长度为m的01串,表示矩阵A。
      接下来一行,包含一个长度为m的01串,表示初始向量b(0)。(b(0)是列向量,这里表示它的转置)
      注意:01串两个相邻的数字之间均没有空格。
      接下来一行,包含一个正整数n,表示询问的个数。
      最后n行,每行包含一个非负整数k,表示询问Akb(0)
      注意:k可能为0,此时是求A0b(0) =b(0)
    输出格式
      输出n行,每行包含一个01串,表示对应询问中Akb(0)的结果。
      注意:01串两个相邻的数字之间不要输出空格。
    样例输入
    3
    110
    011
    111
    101
    10
    0
    2
    3
    14
    1
    1325
    6
    124124
    151
    12312
    样例输出
    101
    010
    111
    101
    110
    010
    100
    101
    001
    100
    评测用例规模与约定
      本题使用10个评测用例来测试你的程序。
      对于评测用例1,m = 10,n = 100,k ≤ 103
      对于评测用例2,m = 10,n = 100,k ≤ 104
      对于评测用例3,m = 30,n = 100,k ≤ 105
      对于评测用例4,m = 180,n = 100,k ≤ 105
      对于评测用例5,m = 10,n = 100,k ≤ 109
      对于评测用例6,m = 30,n = 100,k ≤ 109
      对于评测用例7,m = 180,n = 100,k ≤ 109
      对于评测用例8,m = 600,n = 100,k ≤ 109
      对于评测用例9,m = 800,n = 100,k ≤ 109
      对于评测用例10,m = 1000,n = 100,k ≤ 109
  • 相关阅读:
    知足老师对于脚跟酸经验
    《伤寒论》理论的临床应用--朱良春
    大便秘结案
    胃脘不适论治
    杏林集叶效方
    腰痛案(知足老师论辩证之重要性)
    小儿外感治疗误区
    小儿外感咳喘案
    漫谈凭脉用药--何少奇
    咽部不适案
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/5307517.html
Copyright © 2020-2023  润新知