CCF真题及答案.pdf

上传人:s****u 文档编号:12746469 上传时间:2020-05-21 格式:PDF 页数:38 大小:407.15KB
返回 下载 相关 举报
CCF真题及答案.pdf_第1页
第1页 / 共38页
CCF真题及答案.pdf_第2页
第2页 / 共38页
CCF真题及答案.pdf_第3页
第3页 / 共38页
点击查看更多>>
资源描述
CCF 历年真题(C+实现) 目录 CCF历年真题(C+实现) . 1 2015 年 9月 . 2 数列分段 . 2 日期计算 . 3 模板生成工具 . 4 2015 年 3月 . 8 图像旋转 . 8 数字排序 . 10 节日 . 11 2014 年 12 月 . 14 门禁系统 . 14 Z字形扫描 . 15 2014 年 9月 . 18 相邻数对 . 18 画图 . 19 字符串匹配 . 22 2014 年 3月 . 24 相反数 . 24 窗口 . 26 命令行选项 . 28 2013 年 12 月 . 32 出现次数最多的数 . 32 ISBN 号码 . 34 最大的矩形 . 35 2015年 9 月 数列分段 试题编号: 201509-1 试题名称: 数列分段 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数 列中共有多少段? 输入格式 输入的第一行包含一个整数 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 using namespace std; int main() int a1000,b,c=0,d; cinb; for(int i=0;iai; d=a0; c=1; for(int i=0;ib;i+) if(ai!=d) c+; d=ai; coutyear; cinday; if(year%4=0) for(int i=0;i12,countday;i+) count+=monthDayi; month=i; count-=monthDaymonth; coutmonth+1endllineNumvarNum; cin.ignore(); for(int i=0;ilineNum;i+) getline(cin,line); content.push_back(line); for(int i=0;ivarNum;i+) getline(cin,line); int pos = line.find( ); varMap.insert(map:value_type(line.substr(0,pos),line.substr(pos); for(int i=0;i=0 if(varMap.count(var) string result = varMapvar.substr(2,varMapvar.length()-3); contenti.replace(pos1,var.length()+6,result); else contenti.replace(pos1,var.length()+6,); pos=pos1+var.length(); else pos = contenti.length(); while(poscontenti.length(); coutcontentimn; typedef vector valVec; vector arr(m,vector(n,0); for(int i=0;ivalue; arrij=value; for(int i=n-1;i=0;i-) for(int j=0;jm;j+) coutarrji ; coutn; int arr1000 = 0; map countMap; for(int i=0;ivalue; arri=value; +countMapvalue; vector valueVector(countMap.begin(),countMap.end(); sort(valueVector.begin(),valueVector.end(),CmpByValue(); for (int i = 0; i != valueVector.size(); +i) coutvalueVectori.first valueVectori.secondabcy1y2; int MonthDays13=0,31,28,31,30,31,30,31,31,30,31,30,31; for(int i=y1;iMonthDaysa) coutnoneendl; else couti/; if(a10) cout0a; else couta; if(day10) cout/0dayendl; else cout/dayn; for(int i=0;irecordi; +analMaprecordi; recordi=analMaprecordi; for(int i=0;in;i+) coutrecordin; typedef vector typeVec; vector arr(n,vector(n,0); for(int i=0;ivalue; arrij=value; for(int i=1;i=n;i+) int temp=i-1; for(int j=0;ji;j+,temp-) if(i%2=0) coutarrjtemp ; else coutarrtempj0;i-) int temp=n-1; for(int j=n-i;jn;j+,temp-) if(i%2=0) coutarrjtemp ; else coutarrtempj ; return 0; 2014年 9 月 相邻数对 问题描述 试题编号: 201409-1 试题名称: 相邻数对 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定 n个不同的整数, 问这些数中有多少对整数, 它们的值正好相差1。 输入格式 输入的第一行包含一个整数 n,表示给定整数的个数。 第二行包含所给定的n 个整数。 输出格式 输出一个整数,表示值正好相差 1 的数对的个数。 样例输入 6 10 2 6 3 7 8 样例输出 3 样例说明 值正好相差 1的数对包括(2, 3), (6, 7), (7, 8)。 评测用例规模与约定 1n; for(int i=0;ivalue; valueVec.push_back(value); sort(valueVec.begin(),valueVec.end(); for(int i=0;ivalueVec.size()-1;i+) if(valueVeci+1-valueVeci)=1) count+; coutcount; return 0; 画图 问题描述 试题编号: 201409-2 试题名称: 画图 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在一个定义了直角坐标系的纸上,画一个(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。 #include #include #include #include using namespace std; void int2str(const int streamn; int * values= new int*n; for(int i=0;in;i+) valuesi=new int4; for(int i=0;ivaluesij; for(int a=valuesi0+1;a=valuesi2;a+) for(int b =valuesi1+1;b=valuesi3;b+) string x; string y; int2str(a,x); int2str(b,y); string xy =x+-+y; countMap.insert(valType(xy,1); coutcountMap.size(); for(int i=0;in;i+) delete valuesi; delete values; return 0; 这里需要说明的是,如果你是使用 C+ 的建议直接用 vector 实现二维数组或者是一维,方 便而且安全。 #include #include #include #include #include using namespace std; void int2str(const int streamn; typedef vector typeVec; vector values(n,vector(4,0); for(int i=0;ivaluesij; for(int a=valuesi0+1;a=valuesi2;a+) for(int b =valuesi1+1;b=valuesi3;b+) string x; string y; int2str(a,x); int2str(b,y); string xy =x+-+y; countMap.insert(valType(xy,1); coutcountMap.size(); return 0; 字符串匹配 问题描述 试题编号: 201409-3 试题名称: 字符串匹配 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。 你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大 写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写 看作相同的字符。 输入格式 输入的第一行包含一个字符串 S,由大小写英文字母组成。 第二行包含一个数字,表示大小写敏感的选项,当数字为 0时表示大 小写不敏感,当数字为 1时表示大小写敏感。 第三行包含一个整数n,表示给出的文字的行数。 接下来 n 行,每行包含一个字符串,字符串由大小写英文字母组成, 不含空格和其他字符。 输出格式 输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了 字符串 S的行。 样例输入 Hello 1 5 HelloWorld HiHiHelloHiHi GrepIsAGreatTool HELLO HELLOisNOTHello 样例输出 HelloWorld HiHiHelloHiHi HELLOisNOTHello 样例说明 在上面的样例中,第四个字符串虽然也是 Hello,但是大小写不正确。 如果将输入的第二行改为0,则第四个字符串应该输出。 评测用例规模与约定 1searchflaglineNum; for(int i=0;iline; valVec.push_back(line); for(int i=0;ilineNum;i+) string temp=valVeci; if(flag) string:size_type pos =temp.find(search); if(pos!=string:npos) couttempendl; else transform(search.begin(),search.end(),search.begin(),:tolower); transform(temp.begin(),temp.end(),temp.begin(),:tolower); string:size_type pos =temp.find(search); if(pos!=string:npos) coutvalVecin; for(int i=0;ivalue; if(value0) pluMap.insert(valType(value,1); else miuMap.insert(valType(value,1); map:iterator iter=pluMap.begin(); map:iterator minIter=miuMap.begin(); int size = pluMap.size()-miuMap.size(); if(size0) while(minIter!=miuMap.end() int s = minIter-first; if(pluMap.count(s - 1) count+; +minIter; else while(iter!=pluMap.end() int s = iter-first; if(miuMap.count(s +1) count+; +iter; coutNM; for(int i=0;ipos; line.push_back(pos); area.push_back(line); for(int i=0;iclikij; for(int i=0;i=0;q-) if(cliki0=areaq1) coutareaq0endl; vector temp=areaq; iterType p = area.begin()+q; area.erase(p); area.push_back(temp); break; if(!flag) coutIGNOREDendl; return 0; 命令行选项 问题描述 试题编号: 201403-3 试题名称: 命令行选项 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。 每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符 串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它 进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不 是选项的参数。 选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项 的形式是一个减号后面跟单个小写字母,如-a 或-b。而带参数选项则 由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者 则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。 该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具 需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小 写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号, 它就表示一个带参数的选项,否则则为不带参数的选项。例如, ab:m: 表 示该程序接受三种选项,即-a(不带参数),-b(带参数), 以及-m(带 参数)。 命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个 命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合 法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分 析部分不构成该命令的选项,因此你的程序应当忽略它们。 输入格式 输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次, 不会有两个相邻的冒号,也不会以冒号开头。 输入的第二行是一个正整数 N(1 N 20),表示你需要处理的命令 行的个数。 接下来有 N 行,每行是一个待处理的命令行,它包括不超过 256 个字 符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只 包含小写字母,数字和减号。 输出格式 输出有 N 行。其中第 i 行以Case i: 开始,然后应当有恰好一个空 格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带 参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令 行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了 多次,只输出最后一次出现时所带的参数。 样例输入 albw:x 4 ls -a -l -a documents -b ls ls -w 10 -x -w 15 ls -a -b -c -d -e -l 样例输出 Case 1: -a -l Case 2: Case 3: -w 15 -x Case 4: -a -b 目前提交只有 90 分,我也不知道哪里问题,头痛,如果各位大神发现,欢迎邮箱 928368598 #include #include #include #include using namespace std; vector split(string str,string pattern) string:size_type pos; vector result; str+=pattern; int size=str.size(); for(int i=0; ilineNum; cin.ignore(); for(int i=0;ilineNum;i+) getline(cin,line); valVec.push_back(line); for(int i=0;i1) for(int j=1;jlineSplit.size();) if(lineSplitj.size()=2) if(pos!=string:npos) if(pos!=str.size()-1) if(strpos+1=:) if(isalnumAndMiu(lineSplitj+1) resultMaplineSplitj=lineSplitj+1; j+=2; else break; else resultMaplineSplitj=; j+; else resultMaplineSplitj=; j+; else break; else break; coutCase i+1: ; iterType iter=resultMap.begin(); for(iter;iter!=resultMap.end();iter+) coutfirstsecond!=) coutsecond ; coutn; for(int i=0;inum; countnum+; if(countnummax) max = countnum; maxNum=num; else if(countnum=max) if(nummaxNum) maxNum=num; coutmaxNum; return 0; ISBN 号码 问题描述 试题编号: 201312-2 试题名称: ISBN号码 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN码包括 9 位数字、1位识别码和 3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其 中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如 0-670-82162-4就是一个标准的 ISBN 码。ISBN码的首位数字表示书籍的出 版语言, 例如 0代表英语; 第一个分隔符“-”之后的三位数字代表出版社, 例如670 代表维京出版社;第二个分隔之后的五位数字代表该书在出版社 的编号;最后一位为识别码。 识别码的计算方法如下: 首位数字乘以 1加上次位数字乘以 2以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为 10,则识别码为大写字母 X。例 如ISBN 号码 0-670-82162-4 中的识别码4 是这样得到的:对 067082162这 9个数字,从左至右,分别乘以 1,2,9,再求和,即 01+62+29=158,然后取 158 mod 11 的结果 4 作为识别码。 编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输 出“Right”;如果错误,则输出是正确的 ISBN 号码。 输入格式 输入只有一行,是一个字符序列,表示一本书的 ISBN 号码(保证输入 符合ISBN号码的格式要求)。 输出格式 输出一行,假如输入的 ISBN 号码的识别码正确,那么输出“Right”, 否则,按照规定的格式,输出正确的 ISBN 号码(包括分隔符“-”)。 样例输入 0-670-82162-4 样例输出 Right 样例输入 0-670-82162-0 样例输出 0-670-82162-4 #include #include using namespace std; int main() string isbn; int count=0; getline(cin,isbn); count=isbn0*1+isbn2*2+isbn3*3+isbn4*4+isbn6*5+isbn7*6+isbn8*7+isbn9*8+i sbn10*9-48*45; int result = count%11; if(result=10) result =40; if(isbn12-48)=result) coutRight; else isbn12=result+48; coutn; for(int i=0;ivalue; val.push_back(value); for(int i=0;in;i+) int rN=0,lN=0,area=0; for(int j=i;jn;j+) if(vali=0;j-) if(vali=valj) lN+; else break; area = vali*(rN+lN-1); maxMap.insert(valType(i,area); vector maxVec(maxMap.begin(),maxMap.end(); vector:iterator iter = max_element(maxVec.begin(),maxVec.end(),isBig); coutsecond; return 0; 由于能力有限,仅仅做了前三道题目,希望能够帮助大家
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 考试试卷


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!