zoukankan      html  css  js  c++  java
  • 第二届CCF软件能力认证

    1.

    相邻数对

    问题描述

      给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。

    输入格式

      输入的第一行包含一个整数n,表示给定整数的个数。
      第二行包含所给定的n个整数。

    输出格式

      输出一个整数,表示值正好相差1的数对的个数。

    样例输入

    6
    10 2 6 3 7 8

    样例输出

    3

    样例说明

      值正好相差1的数对包括(2, 3), (6, 7), (7, 8)。

    评测用例规模与约定

      1<=n<=1000,给定的整数为不超过10000的非负整数。

     1  include <iostream>
     2 # include <cstdio>
     3 # include <cstring>
     4 # include <algorithm>
     5 # include <cmath>
     6 # define LL long long
     7 using namespace std ;
     8 
     9 int a[1010] ;
    10 
    11 int main ()
    12 {
    13     //freopen("in.txt","r",stdin) ;
    14     int n ;
    15     scanf("%d" , &n) ;
    16     int i , j ;
    17     int sum = 0 ;
    18     for (i = 0 ; i < n ; i++)
    19     {
    20         scanf("%d" , &a[i]) ;
    21     }
    22 
    23     sort(a , a+n) ;
    24 
    25     for (i = 0 ; i < n ; i++)
    26     {
    27         if (a[i+1] - a[i] != 1)
    28            continue;
    29         else
    30             sum++ ;
    31     }
    32     printf("%d
    " , sum) ;
    33 
    34     return 0 ;
    35 }
    View Code

    2.

    画图

    问题描述

      在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色。
      下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。

    给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。

    输入格式

      输入的第一行包含一个整数n,表示要画的矩形的个数。
      接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。

    输出格式

      输出一个整数,表示有多少个单位的面积被涂上颜色。

    样例输入

    2
    1 1 4 4
    2 3 6 5

    样例输出

    15

    评测用例规模与约定

      1<=n<=100,0<=横坐标、纵坐标<=100。

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <cstring>
     4 # include <algorithm>
     5 # include <cmath>
     6 # define LL long long
     7 using namespace std ;
     8 
     9 int a[110][110] ;
    10 
    11 int main ()
    12 {
    13     //freopen("in.txt","r",stdin) ;
    14     int n ;
    15     scanf("%d" , &n) ;
    16     int i , j ;
    17     int x1 , y1 , x2 , y2 ;
    18     int sum = 0 ;
    19     while(n--)
    20     {
    21         scanf("%d%d%d%d" , &x1,&y1,&x2,&y2) ;
    22         for (i = x1+1 ; i <= x2 ; i++)
    23             for (j = y1+1 ; j <= y2 ; j++)
    24                a[i][j] = 1 ;
    25     }
    26     for (i = 1 ; i <= 105 ; i++)
    27         for (j = 1 ; j <= 105 ; j++)
    28             sum += a[i][j] ;
    29     printf("%d
    " , sum) ;
    30 
    31 
    32     return 0 ;
    33 }
    View Code

    3.

    字符串匹配

    问题描述

      给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。

    输入格式

      输入的第一行包含一个字符串S,由大小写英文字母组成。
      第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
      第三行包含一个整数n,表示给出的文字的行数。
      接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。

    输出格式

      输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。

    样例输入

    Hello
    1
    5
    HelloWorld
    HiHiHelloHiHi
    GrepIsAGreatTool
    HELLO
    HELLOisNOTHello

    样例输出

    HelloWorld
    HiHiHelloHiHi
    HELLOisNOTHello

    样例说明

      在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。

    评测用例规模与约定

      1<=n<=100,每个字符串的长度不超过100。

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <cstring>
     4 # include <algorithm>
     5 # include <cmath>
     6 # define LL long long
     7 using namespace std ;
     8 
     9 const int N = 110;
    10 int next[N];
    11 char S[N], T[N] , S1[N];
    12 int slen, tlen;
    13 
    14 void getNext()
    15 {
    16     int j, k;
    17     j = 0; k = -1; next[0] = -1;
    18     while(j < tlen)
    19         if(k == -1 || T[j] == T[k])
    20             next[++j] = ++k;
    21         else
    22             k = next[k];
    23 
    24 }
    25 
    26 int KMP_Count()
    27 {
    28     int ans = 0;
    29     int i, j = 0;
    30 
    31     if(slen == 1 && tlen == 1)
    32     {
    33         if(S[0] == T[0])
    34             return 1;
    35         else
    36             return 0;
    37     }
    38     getNext();
    39     for(i = 0; i < slen; i++)
    40     {
    41         while(j > 0 && S[i] != T[j])
    42             j = next[j];
    43         if(S[i] == T[j])
    44             j++;
    45         if(j == tlen)
    46         {
    47             ans++;
    48             j = next[j];
    49         }
    50     }
    51     return ans;
    52 }
    53 
    54 int main ()
    55 {
    56     //freopen("in.txt","r",stdin) ;
    57     int n , sum , tag ;
    58     int i ;
    59     cin>>T ;
    60     tlen = strlen(T);
    61     cin>>tag>>n ;
    62     if(tag == 1)
    63     {
    64         while(n--)
    65         {
    66             cin>>S ;
    67             slen = strlen(S);
    68             sum = KMP_Count() ;
    69             if (sum >= 1)
    70                 cout<<S<<endl ;
    71         }
    72     }
    73     else
    74     {
    75         for (i = 0 ; i < tlen ; i++)
    76             T[i] = tolower(T[i]) ;
    77         while(n--)
    78         {
    79             cin>>S1 ;
    80             slen = strlen(S1);
    81             for (i = 0 ; i < slen ; i++)
    82                 S[i] = tolower(S1[i]) ;
    83             sum = KMP_Count() ;
    84             if (sum >= 1)
    85                 cout<<S1<<endl ;
    86         }
    87     }
    88 
    89     return 0 ;
    90 }
    View Code

    4.

    最优配餐

    问题描述

      栋栋最近开了一家餐饮连锁店,提供外卖服务。随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题。
      栋栋的连锁店所在的区域可以看成是一个n×n的方格图(如下图所示),方格的格点上的位置上可能包含栋栋的分店(绿色标注)或者客户(蓝色标注),有一些格点是不能经过的(红色标注)。
      方格图中的线表示可以行走的道路,相邻两个格点的距离为1。栋栋要送餐必须走可以行走的道路,而且不能经过红色标注的点。

    送餐的主要成本体现在路上所花的时间,每一份餐每走一个单位的距离需要花费1块钱。每个客户的需求都可以由栋栋的任意分店配送,每个分店没有配送总量的限制。
      现在你得到了栋栋的客户的需求,请问在最优的送餐方式下,送这些餐需要花费多大的成本。

    输入格式

      输入的第一行包含四个整数n, m, k, d,分别表示方格图的大小、栋栋的分店数量、客户的数量,以及不能经过的点的数量。
      接下来m行,每行两个整数xi, yi,表示栋栋的一个分店在方格图中的横坐标和纵坐标。
      接下来k行,每行三个整数xi, yi, ci,分别表示每个客户在方格图中的横坐标、纵坐标和订餐的量。(注意,可能有多个客户在方格图中的同一个位置)
      接下来d行,每行两个整数,分别表示每个不能经过的点的横坐标和纵坐标。

    输出格式

      输出一个整数,表示最优送餐方式下所需要花费的成本。

    样例输入

    10 2 3 3
    1 1
    8 8
    1 5 1
    2 3 3
    6 7 2
    1 2
    2 2
    6 8

    样例输出

    29

    评测用例规模与约定

      前30%的评测用例满足:1<=n <=20。
      前60%的评测用例满足:1<=n<=100。
      所有评测用例都满足:1<=n<=1000,1<=m, k, d<=n^2。可能有多个客户在同一个格点上。每个客户的订餐量不超过1000,每个客户所需要的餐都能被送到。

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <cstring>
     4 # include <algorithm>
     5 # include <cmath>
     6 # include <queue>
     7 # define LL long long
     8 using namespace std ;
     9 
    10 int map[110][110] ;
    11 bool v[110][110] ;
    12 int n , m , k , d ;
    13 
    14 struct kehu
    15 {
    16     int x ;
    17     int y ;
    18     int num ;
    19 }s[10010];
    20 
    21 struct node
    22 {
    23     int x , y , step ;
    24 };
    25 
    26 int dx[] = {1,-1,0,0} ;
    27 int dy[] = {0,0,1,-1} ;
    28 
    29 int bfs(int sx , int sy )
    30 {
    31     queue<node> q ;
    32     int i , fx ,fy ;
    33     node now , t ;
    34     now.x = sx ;
    35     now.y = sy ;
    36     now.step = 0 ;
    37     q.push(now) ;
    38     memset(v , 0 , sizeof(v)) ;
    39     v[sx][sy] = 1 ;
    40      while(!q.empty())
    41     {
    42         now = q.front() ;
    43         q.pop() ;
    44         for (i = 0 ; i < 4 ; i++)
    45         {
    46             fx = now.x + dx[i] ;
    47             fy = now.y + dy[i] ;
    48             if (fx<1 || fy<1 || fx> n || fy> n || map[fx][fy] == 1 || v[fx][fy] == 1)
    49                 continue ;
    50             if (map[fx][fy] == 2)
    51             {
    52                 return now.step+1 ;
    53             }
    54             t.x = fx ;
    55             t.y = fy ;
    56             t.step = now.step+1 ;
    57             q.push(t) ;
    58             v[fx][fy] = 1 ;
    59         }
    60     }
    61 }
    62 
    63 int main()
    64 {
    65     //freopen("in.txt","r",stdin) ;
    66 
    67     int i , j ;
    68     int t1 , t2 ;
    69     int st = 0 ;
    70     int sum = 0 ;
    71     scanf("%d%d%d%d" , &n , &m , &k , &d) ;
    72     for (i = 0 ; i < m ; i++)
    73     {
    74         scanf("%d%d" , &t1 , &t2) ;
    75         map[t1][t2] = 2 ;
    76     }
    77     for (i = 0 ; i < k ; i++)
    78         scanf("%d%d%d" , &s[i].x , &s[i].y ,&s[i].num) ;
    79     for (i = 0 ; i < d ; i++)
    80     {
    81         scanf("%d%d" , &t1 , &t2) ;
    82         map[t1][t2] = 1 ;
    83     }
    84 
    85     for (i = 0 ; i < k ; i++)
    86     {
    87         st = bfs(s[i].x , s[i].y ) ;
    88         sum += (st * s[i].num) ;
    89     }
    90     printf("%d
    " , sum) ;
    91 
    92 
    93 
    94     return 0 ;
    95 }
    View Code

    5.

    拼图

    省略...=.=

  • 相关阅读:
    每日一水 POJ8道水题
    编译和使用 MySQL C++ Connector
    j2ee model1模型完成分页逻辑的实现 详解!
    DB查询分析器访问EXCEL时,要在表名前后加上中括弧或双引号
    指向结构体变量的指针
    EOSS V3.0 企业运营支撑系统(基于RBAC原理的权限管理)
    MybatisGen1.0 Mybatis JavaBean Mapper生成工具
    The table name must be enclosed in double quotation marks or sqare bracket while accessing EXCEL by
    资源-Android:Android
    软件-开发软件:Android Studio
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/4776565.html
Copyright © 2011-2022 走看看