第二次CCF计算机软件能力认证

这篇具有很好参考价值的文章主要介绍了第二次CCF计算机软件能力认证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一题:相邻数对

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

输出格式

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

第二行包含所给定的 n 个整数。

输出格式

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

数据范围

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

输入样例:
6
10 2 6 3 7 8
输出样例:
3
样例解释

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

解题思路:直接进行模拟即可。

以下是代码:文章来源地址https://www.toymoban.com/news/detail-533633.html

c++

#include<iostream>

using namespace std;

const int N = 1010;
int a[N] , n;

int main()
{
    cin >> n;
    for(int i = 0;i < n;i ++)
        cin >> a[i];
    
    long long res = 0;
    for(int i = 0;i < n;i ++)
        for(int j = i + 1;j < n;j ++)
            if(abs(a[i] - a[j]) == 1) res ++;
    cout << res << endl;
    return 0;
}

python

n = int(input())
l = list(map(int , input().split()))
res = 0
for i in range(n):
    for j in range(i + 1 , n):
        if abs(l[i] - l[j]) == 1:
            res += 1
print(res)

第二题:画图

在一个定义了直角坐标系的纸上,画一个 (x1,y1) 到 (x2,y2) 的矩形指将横坐标范围从 x1 到 x2,纵坐标范围从 y1 到 y2 之间的区域涂上颜色。

下图给出了一个画了两个矩形的例子。

第一个矩形是 (1,1) 到 (4,4),用绿色和紫色表示。

第二个矩形是 (2,3) 到 (6,5),用蓝色和紫色表示。

图中,一共有 15 个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。

在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。

第二次CCF计算机软件能力认证,ccf csp,算法,数据结构,c++,python

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

输入格式

输入的第一行包含一个整数 n,表示要画的矩形的个数。

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

输出格式

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

数据范围

1≤n≤100,
0≤ 横坐标、纵坐标 ≤100

输入样例:
2
1 1 4 4
2 3 6 5
输出样例:
15

解题思路:直接进行模拟即可。

以下是代码:

c++

#include<iostream>
#include<cstring>

using namespace std;

const int N = 110;
int t;
bool st[N][N];

int main()
{
    memset(st , 0 , sizeof st);
    cin >> t;
    while(t --)
    {
        int a , b , c , d;
        cin >> a >> b >> c >> d;
        for(int i = a;i < c;i ++)
            for(int j = b;j < d;j ++)
                st[i][j] = true;
    }
    int res = 0;
    for(int i = 0;i < N;i ++)
        for(int j = 0;j < N;j ++)
            if(st[i][j]) res ++;

    cout << res << endl;
    return 0;
}

python

st = [[False] * 105 for i in range(105)]
for _ in range(int(input())):
    a , b , c , d = map(int , input().split())
    for i in range(a , c):
        for j in range(b , d):
            st[i][j] = True
res = 0
for i in range(101):
    for j in range(101):
        if st[i][j]:
            res += 1
print(res)

第三题:字符串匹配

给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。

你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。

输入格式

输入的第一行包含一个字符串 S,由大小写英文字母组成。

第二行包含一个数字,表示大小写敏感的选项,当数字为 0 时表示大小写不敏感,当数字为 1 时表示大小写敏感。

第三行包含一个整数 n,表示给出的文字的行数。

接下来 n 行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。

输出格式

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

数据范围

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

输入样例:
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
输出样例:
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello
样例解释

在上面的样例中,第四个字符串虽然也是 Hello,但是大小写不正确。

如果将输入的第二行改为 0,则第四个字符串应该输出。

 解题思路:如果判断类型是0,那么统一将所有的大写字母改成小写字母,只需要枚举每一个字母,将大写字母使用异或32即可得到小写字母。

以下是代码:

c++

#include<iostream>
#include<algorithm>

using namespace std;

string s;
int type , t;

string change(string str)
{
    string res;
    for(char i : str)
        if(i <= 'Z') res += i ^ 32;
        else res += i;
    return res;
}

int main()
{
    cin >> s;
    cin >> type;
    if(!type) s = change(s);
    cin >> t;
    while(t --)
    {
        string str;
        cin >> str;
        if(!type && change(str).find(s) != -1) cout << str << endl;
        else if(type && str.find(s) != -1) cout << str << endl;
    }
    return 0;
}

python

s = input()
t = int(input())
def change(s):
    res = ''
    for i in s:
        if ord(i) <= ord('Z'):
            res += chr(ord(i) + ord('a') - ord('A'))
        else:
            res += i
    return res

if t == 0:
    s = change(s)
for _ in range(int(input())):
    w = input()
    if t == 0:
        if s in change(w):
            print(w)
    else:
        if s in w:
            print(w)

 第四题:最优配餐

栋栋最近开了一家餐饮连锁店,提供外卖服务。

随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题。

栋栋的连锁店所在的区域可以看成是一个 n×n的方格图(如下图所示),方格的格点上的位置上可能包含栋栋的分店(绿色标注)或者客户(蓝色标注),有一些格点是不能经过的(红色标注)。

方格图中的线表示可以行走的道路,相邻两个格点的距离为 1。

栋栋要送餐必须走可以行走的道路,而且不能经过红色标注的点。

第二次CCF计算机软件能力认证,ccf csp,算法,数据结构,c++,python

送餐的主要成本体现在路上所花的时间,每一份餐每走一个单位的距离需要花费 1 块钱。

每个客户的需求都可以由栋栋的任意分店配送,每个分店没有配送总量的限制。

现在你得到了栋栋的客户的需求,请问在最优的送餐方式下,送这些餐需要花费多大的成本。

输入格式

输入的第一行包含四个整数 n,m,k,d,分别表示方格图的大小、栋栋的分店数量、客户的数量,以及不能经过的点的数量。

接下来 m 行,每行两个整数 xi,yi,表示栋栋的一个分店在方格图中的横坐标和纵坐标。

接下来 k 行,每行三个整数 xi,yi,ci,分别表示每个客户在方格图中的横坐标、纵坐标和订餐的量。(注意,可能有多个客户在方格图中的同一个位置)

接下来 d 行,每行两个整数,分别表示每个不能经过的点的横坐标和纵坐标。

输出格式

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

数据范围

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

输入样例:
10 2 3 3
1 1
8 8
1 5 1
2 3 3
6 7 2
1 2
2 2
6 8
输出样例:
29

 

 

 解题思路:使用bfs进行洪泛操作,对于每一个可以送出外卖的点加入队列,然后求出每一个可以到达的点的最短距离,最终成本就是所有的需要被送餐的点乘以需要的餐品的总数求和,即可得到答案。

以下是代码:

c++

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>

#define x first
#define y second

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;
const int N = 1010;

int n, m, k, d;
bool g[N][N];
int dist[N][N];
queue<PII> q;
struct Target
{
    int x, y, c;
}tg[N * N];

void bfs()
{
    int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
    while (q.size())
    {
        auto t = q.front();
        q.pop();

        for (int i = 0; i < 4; i ++ )
        {
            int x = t.x + dx[i], y = t.y + dy[i];
            if (x < 1 || x > n || y < 1 || y > n || g[x][y]) continue;
            if (dist[x][y] > dist[t.x][t.y] + 1)
            {
                dist[x][y] = dist[t.x][t.y] + 1;
                q.push({x, y});
            }
        }
    }
}

int main()
{
    scanf("%d%d%d%d", &n, &m, &k, &d);
    memset(dist, 0x3f, sizeof dist);
    while (m -- )
    {
        int x, y;
        scanf("%d%d", &x, &y);
        dist[x][y] = 0;
        q.push({x, y});
    }

    for (int i = 0; i < k; i ++ )
        scanf("%d%d%d", &tg[i].x, &tg[i].y, &tg[i].c);

    while (d -- )
    {
        int x, y;
        scanf("%d%d", &x, &y);
        g[x][y] = true;
    }
    bfs();

    LL res = 0;
    for (int i = 0; i < k; i ++ )
        res += dist[tg[i].x][tg[i].y] * tg[i].c;
    printf("%lld\n", res);
    return 0;
}

 python

太慢了没过,还是使用c++

 第五题:拼图

给出一个 n×m 的方格图,现在要用如下 L 型的积木拼到这个图中,使得方格图正好被拼满,请问总共有多少种拼法。

其中,方格图的每一个方格正好能放积木中的一块。

积木可以任意旋转。

第二次CCF计算机软件能力认证,ccf csp,算法,数据结构,c++,python

输入格式

输入的第一行包含两个整数 n,m,表示方格图的大小。

输出格式

输出一行,表示可以放的方案数,由于方案数可能很多,所以请输出方案数除以 1e9+7的余数。

数据范围

在评测时将使用 10 个评测用例对你的程序进行评测。
评测用例 1 和 2 满足:1≤n≤30,m=2。
评测用例 3 和 4 满足:1≤n,m≤6。
评测用例 5 满足:1≤n≤100,1≤m≤6。
评测用例 6 和 7 满足:1≤n≤1000,1≤m≤6。
评测用例 8、9 和 10 满足:1≤n≤1e15,1≤m≤7。

输入样例:
6 2
输出样例:
4
样例解释

四种拼法如下图所示:

第二次CCF计算机软件能力认证,ccf csp,算法,数据结构,c++,python

 解题思路:

前后挨着的两列摆放有对应关系,我们可以用二进制位表示同一列各位的填充状态:1填充,0未填充
f[i][j], i 表示列号,j表示当前列的填充状态,f[i][j]表示方案数
f[i][0] = f[i-1][0]*w[0][0] + f[i-1][1]*w[1][0] + f[i-1][2] * w[2][0] +...+ f[i-1][2^m - 1]*w[2^m -1][0]
w矩阵是记录状态转移方案的矩阵,w[k][b]表示由相邻两列i, i+1 ,列i状态k转换到列i+1状态b的排布方案数
F[i] = {f[i][0],f[i][1],...,f[i][2^m - 1]}
F[i+1] = {f[i+1][0],f[i+1][1],...,f[i+1][2^m - 1]} 
f[i+1][0] = f[i][0]*w[0][0] + f[i][1] * w[1][0]+...+ f[i][2^m -1] * w[2^m -1][0]
f[i+1][1] = f[i][0]*w[0][1] + f[i][1] * w[1][1]+...+ f[i][2^m -1] * w[2^m -1][1]
...
f[i+1][2^m -1] = f[i][0]*w[0][2^m -1] + f[i][1] * w[1][2^m -1]+...+ f[i][2^m -1] * w[2^m -1][2^m -1]
--> F[i+1] = F[i] * w
--> F[n] = F[n-1]* w = F[n-2]*w*w = ... = F[0]*w^n
F[0]只有一个合法状态就是f[0][2^m - 1] = 1,即第0列全部排满只有一种方案,其余方案数均为0

(学习学习)

以下是代码:

c++

#include<iostream>
#include<algorithm>
#include<cstring>

using  namespace std;

const int N = 130, mod = 1e9+7;

typedef long long LL;

int w[N][N];
LL n;
int m;
void dfs(int x,int y,int u)
{
    if(u == m)  w[x][y]++;  // 枚举完x列的各个位,对应的方案数+1
    if(x >> u & 1)  return dfs(x,y,u+1); // x列第u位是非空状态,直接在看下一位
    else
    {
        if(u && !(y >> u & 1) && !(y >> u - 1 & 1))  // 摆法1:当y列的 第u 和 u - 1位为空
            dfs(x, y + (1 << u ) + (1 << u - 1), u + 1);
        if(u + 1 < m && !(y >> u & 1) && !(y >> u + 1 & 1)) //摆法2:当y列的第u 和 u+1 位为空
            dfs(x, y + (1 << u ) + (1 << u + 1), u + 1);
        if(u + 1 <m && !(x >> u + 1 & 1))  // 列x的第u+1位也为空
        {
            if(!(y << u + 1 & 1))  dfs(x, y + 1<<u+1, u + 2); //摆法3,y的第u+1位为空
            if(!(y << u & 1))  dfs(x, y + 1 << u, u + 2);  //摆法4,y的第u位为空
        }
    }
}

void mulit(int c[][N], int a[][N],int b[][N])
{
    static int tmp[N][N];
    memset(tmp,0,sizeof tmp);
    for(int i=0; i< 1<<m; i++)
        for(int j = 0; j < 1<<m; j++)
            for(int k = 0; k < 1<<m; k++)
                tmp[i][j] = (tmp[i][j] + (LL)a[i][k] * b[k][j]) % mod;  //矩阵乘法
    memcpy(c,tmp,sizeof tmp);
}

int main()
{
    cin >> n >> m;
    for(int i=0; i< 1 <<m ; i++)
        dfs(i,0,0);

    int res[N][N] = {0}; //F
    res[0][(1 << m )-1] = 1;
    while(n)
    {
        if(n & 1)  mulit(res,res,w);
        mulit(w,w,w);
        n >>= 1;
    }
    cout << res[0][(1 << m) - 1] << endl;  //只有第一行是我们要的结果,所以是res[0],
    return 0;

}

到了这里,关于第二次CCF计算机软件能力认证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第30次CCF计算机软件能力认证

    100+100+100+80+100=480 依次给定 (n) 个国际象棋局面,依次回答每个局面是第几次出现。 拿 map 记录下每个局面,统计计数即可。 神奇的代码 给定 (n times d) 的矩阵 (q, k, v) ,一个 (n) 维向量 (w) ,计算 ((w cdot (q times k^{T})) times v) 的结果。 (n leq 10^4, d leq 20) (q times k

    2024年02月06日
    浏览(34)
  • 第31次CCF计算机软件能力认证

    100+100+100+100+60=460 给定 (n) 个操作,每个操作将坐标 ((x,y)) 变为 ((x + dx, y + dy)) 。 给定 (m) 个点,问这 (m) 个点经过这 (n) 次操作变换后的坐标。 注意到操作是可合并的,因此可以先将这 (n) 个操作合并成一个操作,然后对每个点都经过这个操作变换即可,时间复杂度

    2024年02月08日
    浏览(33)
  • 第27次CCF-CSP计算机软件能力认证(2022-09-18)

    个人感想:算是完成了自己期望的目标300分吧,比之前进步了。第一题花了十五分钟,有十多分钟都是在看题。第二题01背包花了半个小时,太久没看动态规划了模板都忘得差不多。第三题的大模拟依旧有难度,写完的时候离比赛结束还剩一个小时。第四题大概看了一下应该

    2024年02月09日
    浏览(43)
  • 计算机串口第二次实验报告

    一、实验目的 熟练使用Linux下io函数read、write和epoll等 熟练处理流式通信数据 二、实验过程 1、向STC单片机下载下面的程序 下载程序后,单片机将使用1200波特率发送自身序列号,格式同上一节课(3.3节内容)相同。请记录下该序列号。 这里可以选择使用串口助手,很容易就

    2024年02月05日
    浏览(55)
  • 计算机组成与体系结构第二次试验:存储器实验

    为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至CSDN中,供同学们学习参考。如有不足或描述不完善之处,敬请各位指出,欢迎各位的斧正! 本实验的主要内容是了解 RAM(Random Access Memory,静态随机存储器)和ROM(Read Only Memory,只读存储器)

    2024年02月08日
    浏览(47)
  • 【全年汇总】2023年CCF计算机图形学与多媒体会议截稿时间汇总(持续更新)

    本博文是根据2022年CCF会议推荐的 计算机图形学与多媒体领域 相关会议目录撰写,更多信息详见公众号CS Conference内容。 (完整PDF大家搜集好了,公众号后台回复“ CCF ”即可获得完整PDF。) 注: 由于一些会议的投稿时间还没公开,因此根据往年投稿时间在 表格中使用 ~ 符

    2024年02月08日
    浏览(50)
  • 【CCF推荐期刊】1/2/3区SCI,计算机通信、算法、人工智能、边缘计算、存储等领域,3个月左右录用

    1/2区计算机通信类 (CCF-C类) 【期刊简介】IF:5.0-6.0,JCR1/2区,中科院3区 【检索情况】SCIEI 双检,正刊 【参考周期】走期刊部系统,3-5个月左右录用 【截稿时间】 2023/3/31 【征稿领域】 涵盖未来计算机通信网络各个方面,如与边缘雾计算、5G及其他物联网应用的结合研究

    2024年02月10日
    浏览(58)
  • CPU的计算机能力和AVX512指令集

    1、Intel的独门绝技 AVX-512指令集包含非常多可以加速工作负载的指令,包括科学模拟、金融分析、人工智能、深度学习、3D建模、音视频处理器、加密解密、数据压缩等。 按照Intel的说法,如果软件支持AVX-512指令集,那么Intel的处理器会有极大的性能提升。 2、对于普通用户意

    2024年02月09日
    浏览(49)
  • 第三届计算机能力挑战赛C语言

    一、单项选择题 1.题 (3.0分) 以下叙述正确的是()。 A.在C程序,至少要包含一个库函数 B.C程序的一行可以写多条语句 C.对一个C程序进行编译就可以生成可执行文件 D.C程序中的注释只能单独一行,不能位于某条语句的后面 2.题 (3.0分) 下面选项中,不是C语言的是()。

    2024年02月04日
    浏览(44)
  • 生成对抗网络与计算机视觉:提升对象检测与识别能力

    计算机视觉技术在过去的几年里取得了显著的进展,这主要是由于深度学习技术的蓬勃发展。深度学习技术在计算机视觉领域的应用主要集中在以下几个方面: 对象检测:通过在图像中识别和定位特定的对象,如人脸、车辆、建筑物等。 图像分类:通过将图像分为多个类别

    2024年02月22日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包