1. 数列分段
    问题描述
      给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段?
    输入格式
      输入的第一行包含一个整数n,表示数列中整数的个数。
      第二行包含n个整数a1, a2, …, an,表示给定的数列,相邻的整数之间用一个空格分隔。
    输出格式
      输出一个整数,表示给定的数列有多个段。
    样例输入
    8
    8 8 8 0 12 12 8 0
    样例输出
    5
    样例说明
      8 8 8是第一段,0是第二段,12 12是第三段,倒数第二个整数8是第四段,最后一个0是第五段。
    评测用例规模与约定
      1 ≤ n ≤ 1000,0 ≤ ai ≤ 1000。

代码:

#include <iostream>using namespace std;int main(){int ans = 0, pre = -1, a, n;cin >> n;while(n --){cin >> a;//第一次遍历 pre = -1 会导致多加1 ,但是数组末尾的那一段少计算了,所以抵消了if(pre != a)++ ans, pre = a;}cout << ans << endl;return 0;
}

  1. 日期计算
    问题描述
      给定一个年份y和一个整数d,问这一年的第d天是几月几日?
      注意闰年的2月有29天。满足下面条件之一的是闰年:
      1) 年份是4的整数倍,而且不是100的整数倍;
      2) 年份是400的整数倍。
    输入格式
      输入的第一行包含一个整数y,表示年份,年份在1900到2015之间(包含1900和2015)。
      输入的第二行包含一个整数d,d在1至365之间。
    输出格式
      输出两行,每行一个整数,分别表示答案的月份和日期。
    样例输入
    2015
    80
    样例输出
    3
    21
    样例输入
    2000
    40
    样例输出
    2
    9
    题解:
      和上一次考试 节日 那题一样,需要模拟日历,熟悉做法即可。

代码:

#include <iostream>using namespace std;int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};bool isLeap(int year){return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}int main(){int y, d, i = 1, j = 1;cin >> y >> d;for(; i <= 12; i ++){int cnt = days[i];if(i == 2 && isLeap(y))cnt = 29;for(j = 1; j <= cnt; j ++){d --;if(!d)break;}if(!d)break;}cout << i << endl << j;return 0;
}

  1. 模板生成系统
    问题描述
      成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的。例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是

      而当用户为 Jerry 时,网页的源代码是

      这样的例子在包含动态内容的网站中还有很多。为了简化生成网页的工作,成成觉得他需要引入一套模板生成系统。
      模板是包含特殊标记的文本。成成用到的模板只包含一种特殊标记,格式为
    ,其中 VAR 是一个变量。该标记在模板生成时会被变量 VAR 的值所替代。例如,如果变量 name = “Tom”,则
    会生成 Tom。具体的规则如下:
      ·变量名由大小写字母、数字和下划线 (_) 构成,且第一个字符不是数字,长度不超过 16 个字符。
      ·变量名是大小写敏感的,Name 和 name 是两个不同的变量。
      ·变量的值是字符串。
      ·如果标记中的变量没有定义,则生成空串,相当于把标记从模板中删除。
      ·模板不递归生成。也就是说,如果变量的值中包含形如
    的内容,不再做进一步的替换。
    输入格式
      输入的第一行包含两个整数 m, n,分别表示模板的行数和模板生成时给出的变量个数。
      接下来 m 行,每行是一个字符串,表示模板。
      接下来 n 行,每行表示一个变量和它的值,中间用一个空格分隔。值是字符串,用双引号 (") 括起来,内容可包含除双引号以外的任意可打印 ASCII 字符(ASCII 码范围 32, 33, 35-126)。
    输出格式
      输出包含若干行,表示模板生成的结果。
    样例输入
11 2
<!DOCTYPE html>
<html>
<head>
<title>User {{ name  }}</title>
</head>
<body>
<h1>{{ name  }}</h1>
<p>Email: <a href="mailto:{{ email }}">{{ email }}</a></p>
<p>Address:{{ address }}</p>
</body>
</html>
name "David Beckham"
email "david@beckham.com"

样例输出

<!DOCTYPE html>
<html>
<head>
<title>User David Beckham</title>
</head>
<body>
<h1>David Beckham</h1>
<p>Email: <a href="mailto:david@beckham.com">david@beckham.com</a></p>
<p>Address: </p>
</body>
</html>

评测用例规模与约定
  0 ≤ m ≤ 100
  0 ≤ n ≤ 100
  输入的模板每行长度不超过 80 个字符(不包含换行符)。
  输入保证模板中所有以 {{ 开始的子串都是合法的标记,开始是两个左大括号和一个空格,然后是变量名,结尾是一个空格和两个右大括号。
  输入中所有变量的值字符串长度不超过 100 个字符(不包括双引号)。
  保证输入的所有变量的名字各不相同。
题解:
  首先把每一行句子存到vector<string> 中,然后获取每个VAR对应的字符串,使用map<string, string> 存储,然后按照行遍历输入的句子,遇到一个VAR,就使用对应的字符串替换,如果该VAR没有替换的字符串,则输出 空 , 其余句子成分就按照远原样输出。

代码:

#include <iostream>
#include <string>
#include <unordered_map>using namespace std;
string arr[110];
unordered_map<string, string> map;int main(){int n, m;string a, b;cin >> n >> m;getchar();//存储句子for(int i = 0; i < n; i ++)getline(cin, arr[i]);while(m --){cin >> a;getline(cin, b);//存储VAR对应的字符串map[a] = b.substr(2, b.length() - 3);}//遍历每一个句子for(int i = 0; i < n; i ++){string tmp = arr[i];for(int j = 0; j < tmp.length(); j ++){//遇到了VARif(j + 1 < tmp.length() && arr[i][j] == '{' && arr[i][j + 1] == '{'){int t = j + 3;//s存储VAR是什么字符串string s;while(t < arr[i].length() && arr[i][t] != ' ')s += tmp[t ++];//需要跳过 " }}" 多于字符j = t + 2;//输出VAR对应的字符串cout << map[s];}else{ //不是VAR就原样输出cout << tmp[j];}}cout << endl;}return 0;
}

  1. 高速公路
    问题描述
      某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路。
      现在,大臣们帮国王拟了一个修高速公路的计划。看了计划后,国王发现,有些城市之间可以通过高速公路直接(不经过其他城市)或间接(经过一个或多个其他城市)到达,而有的却不能。如果城市A可以通过高速公路到达城市B,而且城市B也可以通过高速公路到达城市A,则这两个城市被称为便利城市对。
      国王想知道,在大臣们给他的计划中,有多少个便利城市对。
    输入格式
      输入的第一行包含两个整数n, m,分别表示城市和单向高速公路的数量。
      接下来m行,每行两个整数a, b,表示城市a有一条单向的高速公路连向城市b。
    输出格式
      输出一行,包含一个整数,表示便利城市对的数量。
    样例输入
    5 5
    1 2
    2 3
    3 4
    4 2
    3 5
    样例输出
    3
    样例说明

      城市间的连接如图所示。有3个便利城市对,它们分别是(2, 3), (2, 4), (3, 4),请注意(2, 3)和(3, 2)看成同一个便利城市对。
    评测用例规模与约定
      前30%的评测用例满足1 ≤ n ≤ 100, 1 ≤ m ≤ 1000;
      前60%的评测用例满足1 ≤ n ≤ 1000, 1 ≤ m ≤ 10000;
      所有评测用例满足1 ≤ n ≤ 10000, 1 ≤ m ≤ 100000。
    题解:
      题目就是要求得有向图中的强连通分量,在每个强连通分量中,如果有 m 个城市,便利城市就对有 Cm2个。使用Tarjin算法来计算有向图中的强连通分量,关于tarjin算法的理解可以百度一下。

代码:

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;const int N = 10010, M = 100010;
vector<int> G[N];
int stk[M], num[M], low[M], scc[M], top = 0, cnt = 0, ans = 0, dfn = 0;
int n, m;void dfs(int u){low[u] = num[u] = ++dfn;stk[top ++] = u;for(int v : G[u]){//没有遍历过if(!num[v]){dfs(v);low[u] = min(low[u], low[v]);//已经访问了,需要回溯}else if(!scc[v]){low[u] = min(low[u], num[v]);}}if(num[u] == low[u]){++ cnt;int tmp = 0;while(true){//栈前面的都是属于一个强连通分量int v = stk[-- top];scc[v] = cnt;++ tmp;if(v == u)break;}ans += tmp * (tmp - 1) / 2;}
}int main(){int a, b;cin >> n >> m;while(m --){cin >> a >> b;G[a].push_back(b);}for(int i = 1; i <= n; i ++)if(!num[i])dfs(i);cout << ans;return 0;
}

  1. 最佳文章
    问题描述
      小明最近在研究一门新的语言,叫做Q语言。Q语言单词和文章都可以用且仅用只含有小写英文字母的字符串表示,任何由这些字母组成的字符串也都是一篇合法的Q语言文章。
      在Q语言的所有单词中,小明选出了他认为最重要的n个。使用这些单词,小明可以评价一篇Q语言文章的“重要度”。
      文章“重要度”的定义为:在该文章中,所有重要的Q语言单词出现次数的总和。其中多次出现的单词,不论是否发生包含、重叠等情况,每次出现均计算在内。
      例如,假设n = 2,小明选出的单词是gvagv和agva。在文章gvagvagvagv中,gvagv出现了3次,agva出现了2次,因此这篇文章的重要度为3+2=5。
      现在,小明想知道,一篇由m个字母组成的Q语言文章,重要度最高能达到多少。
    输入格式
      输入的第一行包含两个整数n, m,表示小明选出的单词个数和最终文章包含的字母个数。
      接下来n行,每行包含一个仅由英文小写字母构成的字符串,表示小明选出的这n个单词。
    输出格式
      输出一行一个整数,表示由m个字母组成的Q语言文章中,重要度最高的文章的重要度。
    样例输入
    3 15
    agva
    agvagva
    gvagva
    样例输出
    11
    样例说明
      15个字母组成的重要度最高的文章为gvagvagvagvagva。
      在这篇文章中,agva出现4次,agvagva出现3次,gvagva出现4次,共计4+3+4=11次。
    评测用例规模与约定
      在评测时将使用10个评测用例对你的程序进行评测。
      设s为构成n个重要单词字母的总个数,例如在样例中,s=4+7+6=17;a为构成n个重要单词字母的种类数,例如在样例中,共有3中字母’a’,‘g’,‘v’,因此a=3。
      评测用例1和2满足2 ≤ n ≤ 3,1500 ≤ m ≤ 2000,s = 40;
      评测用例3和4满足m = 20,2 ≤ a ≤ 3;
      评测用例5、6和7满足2000 ≤ m ≤ 100000;
      评测用例8满足n = 2;
      所有的评测用例满足1 ≤ s ≤ 100,1 ≤ m ≤ 1015,每个单词至少包含1个字母,保证单词中仅出现英文小写字母,输入中不含多余字符,不会出现重复的单词。
    题解:
      贴一道AC代码,源代码戳这里

代码:

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef long long LL;
const int N = 110;
const LL INF = 1e18;int n;
LL m;
int tr[N][26], cnt[N], ne[N], idx;
int q[N];
LL ans[N][N], w[N][N];void insert(char* str)
{int p = 0;for (int i = 0; str[i]; i ++ ){int u = str[i] - 'a';if (!tr[p][u]) tr[p][u] = ++ idx;p = tr[p][u];}cnt[p] ++ ;
}void build()
{int hh = 0, tt = -1;for (int i = 0; i < 26; i ++ )if (tr[0][i])q[ ++ tt] = tr[0][i];while (hh <= tt){int t = q[hh ++ ];for (int i = 0; i < 26; i ++ ){int p = tr[t][i];if (!p) tr[t][i] = tr[ne[t]][i];else{ne[p] = tr[ne[t]][i];cnt[p] += cnt[ne[p]];q[ ++ tt] = p;}}}
}void mul(LL c[][N], LL a[][N], LL b[][N])
{static LL tmp[N][N];memset(tmp, -0x3f, sizeof tmp);for (int i = 0; i <= idx; i ++ )for (int j = 0; j <= idx; j ++ )for (int k = 0; k <= idx; k ++ )tmp[i][j] = max(tmp[i][j], a[i][k] + b[k][j]);memcpy(c, tmp, sizeof tmp);
}int main()
{cin >> n >> m;char str[N];while (n -- ){cin >> str;insert(str);}build();memset(w, -0x3f, sizeof w);for (int i = 0; i <= idx; i ++ )for (int j = 0; j < 26; j ++ ){int k = tr[i][j];w[i][k] = max(w[i][k], (LL)cnt[k]);}for (int i = 1; i <= idx; i ++ ) ans[0][i] = -INF;while (m){if (m & 1) mul(ans, ans, w);mul(w, w, w);m >>= 1;}LL res = 0;for (int i = 0; i <= idx; i ++ ) res = max(res, ans[0][i]);cout << res << endl;return 0;
}

ccf-csp 2015秋季真题题解相关推荐

  1. python认证考试_Python入门习题(39)——CCF CSP认证考试真题:公共钥匙盒

    CCF CSP认证考试真题:共钥匙盒 问题描述 试题编号:201709-2 试题名称:公共钥匙盒 时间限制:1.0s 内存限制:256.0MB 问题描述 有一个学校的老师共用N个教室,按照规定,所有的 ...

  2. CCF CSP认证历年真题 满分代码(持续更新中)

    目标 在接下来的半年到一年时间内,补全CCF认证历年真题(A-D)的满分代码(E题随缘). 考虑到CCF认证这个东西是可以混分的,我计划对D.E题额外增加部分分代码,或许有助于不同层次的选手备赛. 除 ...

  3. python认证考试有哪些_Python入门习题(19)——CCF CSP认证考试真题:中间数

    问题描述 试题编号:201703-1 试题名称:分蛋糕 时间限制:1.0s 内存限制:256.0MB 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, ...

  4. ccf-csp 2015春季真题题解

    图像旋转 问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度. 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可. 输入格式 输入的 ...

  5. CSP认证历年真题题解 (Python)

    文章目录 此篇文章是小菜本菜使用Python做CCF-CSP的一些记录,希望能够以此帮助到正在为题目苦苦思考,但还没有找到解决思路的朋友们.诚然,这里的代码还有很多值得改进之处,希望各位码友不吝赐教. ...

  6. ccf-csp 2014秋季真题题解

    相邻数对 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给定整数的个数. 第二行包含所给定的n个整数. 输出格式 输出一个整数, ...

  7. Python入门习题(19)——CCF CSP认证考试真题:分蛋糕

    问题描述 试题编号: 201703-1 试题名称: 分蛋糕 时间限制: 1.0s 内存限制: 256.0MB 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为 ...

  8. 历届CSP真题题解-CSP刷真题之路

    历届CSP真题题解-CSP刷真题之路(持续更新中...) 2020-12 2020-09 2020-06 2019-12 2020-12 题目编号 题解链接 CSP202012-1 期末预测之安全指数 ...

  9. 考研数学一2015年真题整理

    便于总结,便于复习,便于联想. 文章目录 2015年真题分析 一高等数学 知识点:拐点的定义 知识点: 条件收敛和收敛 知识点: 方向导数和条件极值 知识点:第二类曲线积分 二 线性代数 知识点:二次 ...

最新文章

  1. java jar包 和 war包 区别
  2. html表单php连接mysql数据库,PHP 连接MySQL数据库
  3. Struts2之OGNL表达式语言
  4. MySQL workbench创建用户与授权
  5. C++:如何在VS中配置第三方动态库 【visual Studio 2017 + Opencv 】
  6. python基于SMTP发送邮件(qq邮箱)
  7. xpath 查询忽略大小
  8. Java的下载与安装简易教程
  9. 高德地图全解析--定位篇
  10. 人脸对齐—级联回归模型和深度学习模型
  11. uos已连接网络但无法访问互联网
  12. 超星武汉分公司实习(web前端)第一周
  13. 对话冉小波:NULS三年来的实战心得与反思 |链捕手
  14. 关于elementui上传图片 隐藏上传按钮
  15. 计算机组成原理(7)指令系统——偏移寻址、堆栈寻址、CISC和RISC
  16. 谁需要闪光灯? CSS3动画蜘蛛侠卡通
  17. 计算机看到硬盘是空白状态,为你解决win7系统磁盘管理显示空白无法使用的处理方法...
  18. STM32F4 | 新建工程模板——寄存器版本 | HAL库入门 | 新建工程模板——库函数版本
  19. 高通字库芯片GT20L16S1Y驱动 0.96寸 OLED 任意显示中文
  20. PMO体系管理制度实例

热门文章

  1. python输出一年有多少时间_python如何输出日期
  2. 平方的和与和的平方之差
  3. swagger2使用
  4. 梅花香自苦寒来 ----议张恂《笑看JavaEye软工坛之叽叽喳喳》
  5. 【AD】Altium designer2020大学阶段快速入门(一)
  6. 网曝某公司在厕所隔间装监控,公开员工如厕画面!公司回应:只是为监控员工吸烟!...
  7. pyc文件究竟是用来干什么的?
  8. 最强大脑非最强,你我都可是天才
  9. jsp空间租用应该注意两个问题
  10. 基于ZYNQ 的多轴运动控制平台关键技术研发-总体架构设计(一)