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

第一题:打酱油

小明带着 N 元钱去买酱油。

酱油 10 块钱一瓶,商家进行促销,每买 3 瓶送 1 瓶,或者每买 5 瓶送 2 瓶。

请问小明最多可以得到多少瓶酱油。

输入格式

输入的第一行包含一个整数 N,表示小明可用于买酱油的钱数。

输出格式

输出一个整数,表示小明最多可以得到多少瓶酱油。

数据范围

N 是 10 的整数倍,N 不超过 300。

输入样例1:

40

输出样例1:

5

样例1解释

把 40 元分成 30 元和 10 元,分别买 3 瓶和 1 瓶,其中 3 瓶送 1 瓶,共得到 5 瓶。

输入样例2:

80

输出样例2:

11

样例2解释

把 80 元分成 30 元和 50 元,分别买 3 瓶和 5 瓶,其中 3 瓶送 1 瓶,5 瓶送 2 瓶,共得到 11 瓶。

解题思路:

暴力搜索,使用深度优先遍历,枚举每一种情况,计算出所使用的瓶子个数。

#include<iostream>using namespace std;int res = 0;
void dfs(int u , int cnt)
{if(u < 0) return ;else if(u == 0) {res = max(res , cnt);return ;}dfs(u - 10 , cnt + 1);dfs(u - 30 , cnt + 4);dfs(u - 50 , cnt + 7);
}int main()
{int n;cin >> n;dfs(n , 0);cout << res << endl;return 0;
}

第二题:公共钥匙盒 

有一个学校的老师共用 N 个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家。

每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒中。

钥匙盒一共有 N 个挂钩,从左到右排成一排,用来挂 N 个教室的钥匙。

一串钥匙没有固定的悬挂位置,但钥匙上有标识,所以老师们不会弄混钥匙。

每次取钥匙的时候,老师们都会找到自己所需要的钥匙将其取走,而不会移动其他钥匙。

每次还钥匙的时候,还钥匙的老师会找到最左边的空的挂钩,将钥匙挂在这个挂钩上。

如果有多位老师还钥匙,则他们按钥匙编号从小到大的顺序还。

如果同一时刻既有老师还钥匙又有老师取钥匙,则老师们会先将钥匙全还回去再取出。

今天开始的时候钥匙是按编号从小到大的顺序放在钥匙盒里的。

有 K 位老师要上课,给出每位老师所需要的钥匙、开始上课的时间和上课的时长,假设下课时间就是还钥匙时间,请问最终钥匙盒里面钥匙的顺序是怎样的?

输入格式

输入的第一行包含两个整数 N,K。

接下来 K 行,每行三个整数 w,s,c,分别表示一位老师要使用的钥匙编号、开始上课的时间和上课的时长。可能有多位老师使用同一把钥匙,但是老师使用钥匙的时间不会重叠。

保证输入数据满足输入格式,你不用检查数据合法性。

输出格式

输出一行,包含 N 个整数,相邻整数间用一个空格分隔,依次表示每个挂钩上挂的钥匙编号。

数据范围

对于 30% 的评测用例,1≤N,K≤10,1≤w≤N,1≤s,c≤30;
对于 60% 的评测用例,1≤N,K≤50,1≤w≤N,1≤s≤300,1≤c≤50,
对于所有评测用例,1≤N,K≤1000,1≤w≤N,1≤s≤10000,1≤c≤100。

输入样例1:

5 2
4 3 3
2 2 7

输出样例1:

1 4 3 2 5

样例1解释

第一位老师从时刻 3 开始使用 4 号教室的钥匙,使用 3 单位时间,所以在时刻 6 还钥匙。

第二位老师从时刻 2 开始使用钥匙,使用 7 单位时间,所以在时刻 9 还钥匙。

每个关键时刻后的钥匙状态如下(X表示空):

时刻 2 后为 1X345;
时刻 3 后为 1X3X5;
时刻 6 后为 143X5;
时刻 9 后为 14325。

输入样例2:

5 7
1 1 14
3 3 12
1 15 12
2 7 20
3 18 12
4 21 19
5 30 9

输出样例2:

1 2 3 5 4

 解题思路:

使用结构体进行存储时间信息。

如果需要取钥匙,那么就枚举每一个钥匙编号,判断该位置是否需要取出,如果取出就将其置为0

如果需要放钥匙,那么就枚举出编号为0的第一个位置,将其置为当前id

注意首先需要对于时间进行排序。

#include<iostream>
#include<algorithm>using namespace std;const int N = 10010;struct time_p
{int id , s , type;
}ti[N];int n , k;
int res[N];bool cmp(time_p a , time_p b)
{if(a.s != b.s) return a.s < b.s;if(a.type != b.type) return a.type > b.type;return a.id < b.id;
}int main()
{cin >> n >> k;int cnt = 0;while(k --){int a , b , c;cin >> a >> b >> c;ti[cnt ++] = {a , b , 0}; // 取钥匙ti[cnt ++] = {a , b + c , 1}; // 放钥匙}sort(ti , ti + cnt , cmp);for (int i = 1; i <= n; i ++ ) res[i] = i;for (int i = 0; i < cnt; i ++ ){int id = ti[i].id;if (!ti[i].type) // 取钥匙{for (int j = 1; j <= n; j ++ )if (res[j] == id){res[j] = 0;break;}}else{for (int j = 1; j <= n; j ++ )if (!res[j]){res[j] = id;break;}}}for (int i = 1; i <= n; i ++ )cout << res[i] << ' ';return 0;
}

第三题:JSON查询

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,可以用来描述半结构化的数据。

JSON 格式中的基本单元是值 (value),出于简化的目的本题只涉及 2 种类型的值:

  • 字符串 (string):字符串是由双引号 " 括起来的一组字符(可以为空)。如果字符串的内容中出现双引号 ",在双引号前面加反斜杠,也就是用 \" 表示;如果出现反斜杠 \,则用两个反斜杠 \\ 表示。反斜杠后面不能出现 " 和 \ 以外的字符。例如:""、"hello"、"\"\\"
  • 对象 (object):对象是一组键值对的无序集合(可以为空)。键值对表示对象的属性,键是属性名,值是属性的内容。对象以左花括号 { 开始,右花括号 } 结束,键值对之间以逗号 , 分隔。一个键值对的键和值之间以冒号 : 分隔。键必须是字符串,同一个对象所有键值对的键必须两两都不相同;值可以是字符串,也可以是另一个对象。例如:{}、{"foo": "bar"}、{"Mon": "weekday", "Tue": "weekday", "Sun": "weekend"}

除了字符串内部的位置,其他位置都可以插入一个或多个空格使得 JSON 的呈现更加美观,也可以在一些地方换行,不会影响所表示的数据内容。

例如,上面举例的最后一个 JSON 数据也可以写成如下形式。

{
"Mon": "weekday",
"Tue": "weekday",
"Sun": "weekend"
}

给出一个 JSON 格式描述的数据,以及若干查询,编程返回这些查询的结果。

输入格式

第一行是两个正整数 n 和 m,分别表示 JSON 数据的行数和查询的个数。

接下来 n 行,描述一个 JSON 数据,保证输入是一个合法的 JSON 对象。

接下来 m 行,每行描述一个查询。给出要查询的属性名,要求返回对应属性的内容。需要支持多层查询,各层的属性名之间用小数点 . 连接。保证查询的格式都是合法的。

输出格式

对于输入的每一个查询,按顺序输出查询结果,每个结果占一行。

如果查询结果是一个字符串,则输出 STRING <string>,其中 <string> 是字符串的值,中间用一个空格分隔。

如果查询结果是一个对象,则输出 OBJECT,不需要输出对象的内容。

如果查询结果不存在,则输出 NOTEXIST

数据范围

n≤100,每行不超过 80 个字符。
m≤100,每个查询的长度不超过 80 个字符。
字符串中的字符均为 ASCII 码 33−126 的可打印字符,不会出现空格所有字符串都不是空串
所有作为键的字符串不会包含小数点 .。查询时键的大小写敏感
50% 的评测用例输入的对象只有 1 层结构,80% 的评测用例输入的对象结构层数不超过 2 层。
举例来说,{"a": "b"} 是一层结构的对象,{"a": {"b": "c"}} 是二层结构的对象,以此类推。

输入样例:

10 5
{
"firstName": "John",
"lastName": "Smith",
"address": {
"streetAddress": "2ndStreet",
"city": "NewYork",
"state": "NY"
},
"esc\\aped": "\"hello\""
}
firstName
address
address.city
address.postal
esc\aped

输出样例:

STRING John
OBJECT
STRING NewYork
NOTEXIST
STRING "hello"

解题思路: 

可以使用python中的stdin进行读入,然后使用eval转化为字典,然后即可判断出来

from sys import stdinn, m = map(int , input().split())str = ""
for i in range(n):str += stdin.readline()obj = eval(str)def query(qs):o = objfor s in qs:# 判断是否是{}字典if type(o) is not dict or s not in o:print("NOTEXIST")returnelse:o = o[s]# 字典输出objectif type(o) is dict:print("OBJECT")else:# 字符串输出字符串中的内容print("STRING %s" % (o))for i in range(m):qs = input().split('.')query(qs)

第四题:通信网络

某国的军队由 N 个部门组成,为了提高安全性,部门之间建立了 M 条通路,每条通路只能单向传递信息,即一条从部门 a 到部门 b 的通路只能由 a 向 b 传递信息。

信息可以通过中转的方式进行传递,即如果 a 能将信息传递到 b,b 又能将信息传递到 c,则 a 能将信息传递到 c。

一条信息可能通过多次中转最终到达目的地。

由于保密工作做得很好,并不是所有部门之间都互相知道彼此的存在。

只有当两个部门之间可以直接或间接传递信息时,他们才彼此知道对方的存在。

部门之间不会把自己知道哪些部门告诉其他部门。

p1.png

上图中给了一个 4 个部门的例子,图中的单向边表示通路。

部门 1 可以将消息发送给所有部门,部门 4 可以接收所有部门的消息,所以部门 1 和部门 4 知道所有其他部门的存在。

部门 2 和部门 3 之间没有任何方式可以发送消息,所以部门 2 和部门 3 互相不知道彼此的存在。

现在请问,有多少个部门知道所有 N 个部门的存在。

或者说,有多少个部门所知道的部门数量(包括自己)正好是 N。

输入格式

输入的第一行包含两个整数 N,M,分别表示部门的数量和单向通路的数量。所有部门从 1 到 N 标号。

接下来 M 行,每行两个整数 a,b,表示部门 a 到部门 b 有一条单向通路。

输出格式

输出一行,包含一个整数,表示答案。

数据范围

对于 30% 的评测用例,1≤N≤10,1≤M≤20;
对于 60% 的评测用例,1≤N≤100,1≤M≤1000;
对于 100% 的评测用例,1≤N≤1000,1≤M≤10000。

输入样例:

4 4
1 2
1 3
2 4
3 4

输出样例:

2

样例解释

部门 1 和部门 4 知道所有其他部门的存在。

 

 解题思路:

正向建图和反向建图,然后做一遍dfs走一遍图。统计出正向和反向之后的都知道的部门数。

#include<iostream>
#include<cstring>using namespace std;const int N = 1010 , M = 20010;
int n , m;
bool st[M];
bool st1[M];
int h[M] , h1[M] , ne[M] , e[M] , idx;void add(int h[] , int a , int b)
{e[idx] = b , ne[idx] = h[a] , h[a] = idx ++;
}void dfs(int u , bool st[] , int h[])
{st[u] = true;for(int i = h[u];~i;i = ne[i]){int j = e[i];if(!st[j]) dfs(j , st , h);}
}int main()
{cin >> n >> m;memset(h , -1 , sizeof h);memset(h1 , -1 , sizeof h1);while(m --){int a , b;cin >> a >> b;add(h , a , b) , add(h1 , b , a);}int res = 0;for(int i = 1;i <= n;i ++){memset(st , 0 , sizeof st);memset(st1 , 0 , sizeof st1);dfs(i , st , h) , dfs(i , st1 , h1);int t = 0;for(int j = 1;j <= n;j ++)if(st[j] || st1[j]) t ++;if(t == n) res ++;}cout << res << endl;return 0;
}

第五题:除法

使用线段树或是树状数组就行

 

#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>using namespace std;typedef long long LL;
const int N = 100010, M = 1000010;int n, m;
set<int> pos[M];
LL tr[N];
set<int> vs;
struct Query
{int t, l, r, v;
}q[N];
int w[N];int lowbit(int x)
{return x & -x;
}void add(int x, int v)
{for (int i = x; i <= n; i += lowbit(i)) tr[i] += v;
}LL query(int x)
{LL res = 0;for (int i = x; i; i -= lowbit(i)) res += tr[i];return res;
}int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i ++ ){scanf("%d", &w[i]);add(i, w[i]);}for (int i = 0; i < m; i ++ ){int t, l, r, v;scanf("%d%d%d", &t, &l, &r);if (t == 1){scanf("%d", &v);q[i] = {t, l, r, v};if (v != 1) vs.insert(v);}else q[i] = {t, l, r};}for (int i = 1; i <= n; i ++ )for (int j = 1; j * j <= w[i]; j ++ )if (w[i] % j == 0){if (vs.count(j)) pos[j].insert(i);if (w[i] / j != j && vs.count(w[i] / j))pos[w[i] / j].insert(i);}for (int i = 0; i < m; i ++ )if (q[i].t == 1){int v = q[i].v;auto it = pos[v].lower_bound(q[i].l);while (it != pos[v].end() && *it <= q[i].r){int k = *it;it ++ ;add(k, -w[k] + w[k] / v);for (int j = 1; j * j <= w[k]; j ++ )if (w[k] % j == 0){pos[j].erase(k);if (w[k] / j != j) pos[w[k] / j].erase(k);}w[k] /= v;for (int j = 1; j * j <= w[k]; j ++ )if (w[k] % j == 0){if (vs.count(j)) pos[j].insert(k);if (w[k] / j != j && vs.count(w[k] / j))pos[w[k] / j].insert(k);}}}else printf("%lld\n", query(q[i].r) - query(q[i].l - 1));return 0;
}

30分直接到手 

#include<iostream>using namespace std;const int N = 1e5 + 10;
int n , m;
int a[N];int main()
{scanf("%d %d" ,&n ,&m);for(int i = 1;i <= n;i ++)scanf("%d" ,&a[i]);while(m --){int op;scanf("%d" ,&op);if(op == 1){int l , r , v;scanf("%d %d %d" ,&l ,&r ,&v);for(int i = l;i <= r;i ++)if(a[i] % v == 0) a[i] /= v;}else{int l , r;scanf("%d %d" ,&l ,&r);int sum = 0;for(int i = l;i <= r;i ++)sum += a[i];printf("%d\n" , sum);}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/29117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】【风格迁移】Visual Concept Translator,一般图像到图像的翻译与一次性图像引导,论文

General Image-to-Image Translation with One-Shot Image Guidance 论文&#xff1a;https://arxiv.org/abs/2307.14352 代码&#xff1a;https://github.com/crystalneuro/visual-concept-translator 文章目录 Abstract1. Introduction2. 相关工作2.1 图像到图像转换2.2. Di…

网络防御(2)

1. 什么是防火墙&#xff1f; 2. 状态防火墙工作原理&#xff1f; 3. 防火墙如何处理双通道协议&#xff1f; 一、什么是防火墙&#xff1f; 防火墙是一种网络安全设备或软件&#xff0c;用于保护计算机网络免受未经授权的访问&#xff0c;并管理网络流量。它作为一个安全边界…

Android中级——RemoteView

RemoteView RemoteView的应用NotificationWidgetPendingIntent RemoteViews内部机制模拟RemoteViews RemoteView的应用 Notification 如下开启一个系统的通知栏&#xff0c;点击后跳转到某网页 public class MainActivity extends AppCompatActivity {private static final …

【Linux取经路】进程的奥秘

文章目录 1、什么是进程&#xff1f;1.1 自己写一个进程 2、操作系统如何管理进程&#xff1f;2.1 描述进程-PCB2.2 组织进程2.3 深入理解进程 3、Linux环境下的进程3.1 task_struct3.2 task_struct内容分类3.3 组织进程3.4 查看进程属性 4、结语 1、什么是进程&#xff1f; 在…

软件单元测试

单元测试目的和意义 对于非正式的软件&#xff08;其特点是功能比较少&#xff0c;后续也不有新特性加入&#xff0c;不用负责维护&#xff09;&#xff0c;我们可以使用debug单步执行&#xff0c;内存修改&#xff0c;检查对应的观测点是否符合要求来进行单元测试&#xff0c…

把网站改为HTTPS访问方法

HTTPS是使用TSL/SSL加密超文本传输协议的扩展&#xff0c;用于跨网络的安全传输。网站更改为HTTPS&#xff0c;直接在网站形象上可以得到提升&#xff0c;更重要的是您的网站肯定会在排名和提升方面受益。机密信息的交换需要受到保护&#xff0c;以阻止未经授权的访问。 加密&a…

类加载机制——双亲委派机制

类加载器分类 类加载器 类加载器&#xff08;英文&#xff1a;ClassLoader&#xff09;负责加载 .class 字节码文件&#xff0c;.class 字节码文件在文件开头有特定的文件标识。ClassLoader 只负责 .class 字节码文件的加载&#xff0c;至于它是否可以运行&#xff0c;则由 E…

Vue-组件二次封装

本次对el-input进行简单封装进行演示 封装很简单&#xff0c;就给激活样式的边框(主要是功能) 本次封装主要使用到vue自带的几个对象 $attrs&#xff1a;获取绑定在组件上的所有属性$listeners: 获取绑定在组件上的所有函数方法$slots&#xff1a; 获取应用在组件内的所有插槽 …

成功解决Android设备adb连接后显示device unauthorized

一、提出问题 在电脑通过USB连接新的Android设备&#xff0c;想要通过adb来进行一些操作时&#xff0c;却发现命令提示符上在输入下面命令后显示设备未授权的信息也就是"unauthorized" adb devices二、不可行的解决方案 有人提出的解决方案是打开Android设备的开发…

2023年新手如何学剪辑视频 想学视频剪辑如何入门

随着短视频、vlog等媒体形式的兴起&#xff0c;视频剪辑已经成为了热门技能。甚至有人说&#xff0c;不会修图可以&#xff0c;但不能不会剪视频。实际上&#xff0c;随着各种智能软件的发展&#xff0c;视频剪辑已经变得越来越简单。接下来&#xff0c;一起来看看新手如何学剪…

【ChatGPT 指令大全】怎么使用ChatGPT来帮我们写作

在数字化时代&#xff0c;人工智能为我们的生活带来了无数便利和创新。在写作领域&#xff0c;ChatGPT作为一种智能助手&#xff0c;为我们提供了强大的帮助。不论是作文、文章&#xff0c;还是日常函电&#xff0c;ChatGPT都能成为我们的得力助手&#xff0c;快速提供准确的文…

MySQL — MVCC

文章目录 MVCCMVCC 实现原理隐藏字段undo logundo log的用途undo log类型 版本链ReadView MVCC InnoDB是一个多版本的存储引擎。它保留有关已更改行的旧版本的信息&#xff0c;以支持并发和回滚等事务性特性。这些信息存储在undo表空间中的数据结构称为回滚段。InnoDB使用回滚…

培训报名小程序报名功能完善

目录 1 修改数据源2 修改表单3 支付成功时修改状态4 创建报名成功页5 最终的效果总结 目前我们的报名功能已经搭建了一个基础版&#xff0c;后续需要展示用户已经报名的信息&#xff0c;需要添加一个状态来显示用户是否成功付费。 1 修改数据源 打开我们的报名数据源&#xff…

【基础类】—前端算法类

一、排序 1. 排序方法列表 2. 常见排序方法 快速排序选择排序希尔排序 二、堆栈、队列、链表 堆栈、队列、链表 三、递归 递归 四、波兰式和逆波兰式 理论源码

机器学习笔记之优化算法(十一)梯度下降法:凸函数VS强凸函数

机器学习笔记之优化算法——梯度下降法&#xff1a;凸函数VS强凸函数 引言凸函数&#xff1a;凸函数的定义与判定条件凸函数的一阶条件凸函数的梯度单调性凸函数的二阶条件 强凸函数强凸函数的定义强凸函数的判定条件强凸函数的一阶条件强凸函数的梯度单调性强突函数的二阶条件…

前后端分离式项目架构流程复盘之宿舍管理系统

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;【&#x1f387;前端】先创建Vue-cli项目&#xff08;版本2.6.10&#xff0c;仅包含babel&#xff09;&#xff0c;请选择此项目并创建 【整理简化项目模板】【&#x1f380;创建路由】…

git clean 命令

git clean -n //显示要删除的文件&#xff0c;clean的演习&#xff0c;告诉哪些文件删除&#xff0c;只是一个提醒。 git clean -dn //显示要删除的文件和目录 git clean -f //删除未追踪的文件 git clean -dff //删除未追踪的目录 git clean -df //清除所有未跟踪文件&#xf…

Netty面试题1

计算机网络模型 OSI采用了分层的结构化技术&#xff0c;共分七层&#xff0c; 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 。 Open System Interconnect 简称OSI&#xff0c;是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参…

互联网医院|线上医疗平台连接医者和患者的桥梁

近年来&#xff0c;随着互联网技术的飞速发展&#xff0c;互联网医院系统悄然崛起&#xff0c;引领着医疗行业的变革浪潮。这一系统以其出色的功能与服务&#xff0c;为广大患者带来了便捷、高效的医疗体验&#xff0c;将传统医疗模式推向了新的高度。 作为医疗界的新生力量&a…

FFmpeg常见命令行(三):FFmpeg转码

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;如何使…