2017ACM比赛试题
- 格式:docx
- 大小:71.35 KB
- 文档页数:8
计算机acm试题及答案一、选择题1. 在计算机科学中,ACM代表什么?A. 人工智能与机器学习B. 计算机辅助制造C. 计算机辅助设计D. 国际计算机学会答案:D2. 下列哪个不是计算机程序设计语言?A. PythonB. JavaC. C++D. HTML答案:D3. 在计算机系统中,CPU代表什么?A. 中央处理单元B. 计算机辅助设计C. 计算机辅助制造D. 计算机辅助教学答案:A二、填空题1. 计算机的内存分为__________和__________。
答案:RAM;ROM2. 在编程中,__________是一种用于存储和操作数据的数据结构。
答案:数组3. 计算机病毒是一种__________,它能够自我复制并传播到其他计算机系统。
答案:恶意软件三、简答题1. 请简述计算机操作系统的主要功能。
答案:计算机操作系统的主要功能包括管理计算机硬件资源,提供用户界面,运行应用程序,以及控制其他系统软件和应用软件的运行。
2. 什么是云计算,它与传统的本地计算有何不同?答案:云计算是一种通过互联网提供计算资源(如服务器、存储、数据库、网络、软件等)的服务模式。
与传统的本地计算相比,云计算允许用户按需获取资源,无需购买和维护物理硬件,具有更高的灵活性和可扩展性。
四、编程题1. 编写一个程序,计算并输出从1到100(包括1和100)之间所有偶数的和。
答案:```pythonsum = 0for i in range(1, 101):if i % 2 == 0:sum += iprint(sum)```2. 给定一个字符串,编写一个函数,将字符串中的所有字符按ASCII 码值排序并返回。
答案:```pythondef sort_string(s):return ''.join(sorted(s))```五、论述题1. 论述计算机硬件和软件之间的关系及其对计算机系统性能的影响。
答案:计算机硬件是计算机系统的物质基础,包括CPU、内存、硬盘等,而软件则是运行在硬件上的程序和数据。
第二十三届全国青少年信息学奥林匹克联赛初赛普及组C++语言试题竞赛时间:2017年10月14日14:30~16:30选手注意:●试题纸共有7页,答题纸共有2页,满分100分。
请在答题纸上作答,写在试题纸上的一律无效。
●不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。
一、单项选择题(共20题,每题1.5分,共计30分;每题有且仅有一个正确选项)1.在8位二进制补码中,表示的数是十进制下的()。
A.43???B.-85???C.-43???D.-842.计算机存储数据的基本单位是()。
A.bit???B.Byte???C.GB???D.KB3.下列协议中与电子邮件无关的是()。
A.POP3???B.SMTP???C.WTO???D.IMAP4.分辨率为800x600、16位色的位图,存储图像信息所需的空间为()。
A.937.5KB???B.4218.75KB???C.4320KB???D.2880KB5.计算机应用的最早领域是()。
A.数值计算???B.人工智能???C.机器人???D.过程控制6.下列不属于面向对象程序设计语言的是()。
A.C???B.C++???C.Java???D.C#7.NOI的中文意思是()。
A.中国信息学联赛???B.全国青少年信息学奥林匹克竞赛C.中国青少年信息学奥林匹克竞赛???D.中国计算机协会8.2017年10月1日是星期日,1999年10月1日是()。
A.星期三???B.星期日???C.星期五???D.星期二9.甲、乙、丙三位同学选修课程,从4门课程中,甲选修2门,乙、丙各选修3门,则不同的选修方案共有()种。
A.36???B.48???C.96???D.19210.设G是有n个结点、m条边(n≤m)的连通图,必须删去G的()条边,才能使得G变成一棵树。
A.m–n+1???B.m-n???C.m+n+1???D.n–m+111.对于给定的序列{ak},我们把(i,j)称为逆序对当且仅当i<j且ai>aj。
1. 给定一个矩阵M(X, Y),列集为X ,行集为Y 。
如果存在对其列的一个排序,使得每一行的元素都严格递增,称M 是一个次序保持矩阵。
例如下图中存在一个排序x 4,x 1,x 2,x 3,x 5I ⊆X ,满足:子矩阵M(I,Y)是次序保持矩阵。
[测试数据] 矩阵M :[测试数据结果] I={ x 1,x 3,x 4,x 7,x 8}[解题思路] 将该问题归约为在一个有向图中找一条最长路径的问题。
给定矩阵M=(a ij ),行集Y ,列集X ,行子集J ⊆Y ,定义有向图D A =(V A ,E A ),其中V A 含有|X|个顶点,每个顶点代表X 中的一列,如果顶点u ,v 对应的列x u ,x v 满足,对于任意的j ∈J ,u v ij ij a a <,则有一条从u 到v 的弧(u ,v )∈E 。
显然,D A 是个无环图,可以在O(|X|2)时间内构造完毕。
对于任意的条件子集J ,A(I,J)是次序保持的当且仅当对应于J 中条件的顶点在D A 中构成一条有向路径。
从而我们只需在有向图D A 中找一条最长路径,该问题可在O(|V A |+| E A |)时间内完成。
按上面的方法构造有向图如下:有向图中找最长路径的线性时间算法。
一些表示方法如下:d out (u )为顶点u 的出度,d in (u )为顶点u 的入度,source 为入度为0的顶点,sink 为出度为0的顶点,N out (u )为u 指向的邻接点集合,P uv 为从u 到v 的最长路,显然应从source 到sink 。
在每一步为每个顶点关联一个永久的或临时的标签。
v被赋了一个临时标签(v’,i v)表明在当前步,算法找出的最长的从source到v的有向路长度为i v,且经由v’而来。
v被赋了一个永久标签[v’,i v]表明从source到v的最长有向路长度为i v,且经由v’而来,通过回溯每个顶点的永久标签就可以找出最长有向路。
武汉科技大学城市学院课程设计报告课程设计名称Java课程设计题目ACM院系信息工程系专业班级姓名指导教师2019 年月日课程设计评分表任务书: Java & ACM在线评测1. 课程设计教学条件要求Eclipse2. 课程设计任务每个同学登录科技大学城市学院ACM10.10.4.55,点击作业,查看2019java课程设计,里面有13个测试题,要求在线完成8-12道题,每题写出解题报告,解题报告容:1.题目标题2.题目描述3.解题思路4.源码5.小结每个题目详细书写解题报告,一题多解的可以加分!!!3.课程设计参考资料[1]罗玉龙.java程序设计. :科学. 2012[2] 何玉洁. 数据库原理与应用教程. :机械工业.2003[3] 罗志高. 数据库原理与应用教程. :人民邮电.2003目录第1题小光棍数 (6)1.1题目描述 (6)1.2解题思路 (6)1.3解决方案 (7)1.4小结 (7)第2题寻找数列 (8)2.1题目描述 (8)2.2解题思路 (8)2.3解决方案 (9)2.4小结 (9)第3题奖学金 (10)3.1题目描述 (10)3.2解题思路 (11)3.3解决方案 (11)3.4小结 (12)第4题黄金分割数 (13)4.1题目描述 (13)4.2解题思路 (13)4.3解决方案 (14)4.4小结 (14)第5题星系炸弹--6TH 蓝桥杯C本科B组第二题 (15)5.1题目描述 (15)5.2解题思路 (15)5.3解决方案 (16)5.4小结 (16)第6题零起点学算法58---开灯问题 (17)6.1题目描述 (17)6.2解题思路 (17)6.3解决方案 (18)6.4小结 (18)第7题华科版C语言程序设计教程(第二版)习题5.7 (19)7.1题目描述 (19)7.2解题思路 (19)7.3解决方案 (20)7.4小结 (20)第8题整数划分1 (21)8.1题目描述 (21)8.2解题思路 (21)8.3解决方案 (22)8.4小结 (22)第1题小光棍数1.1题目描述为了迎接一年一度光棍节的到来,让我们一起来看看小光棍数吧。
ACM作业与答案整理1、平面分割方法:设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。
#include <iostream.h>int f(int n){if(n==1) return 2;else return f(n-1)+2*(n-1);}void main(){int n;while(1){cin>>n;cout<<f(n)<<endl;}}2、LELE的RPG难题:有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.编程全部的满足要求的涂法.#include<iostream.h>int f(int n){if(n==1) return 3;else if(n==2) return 6;else return f(n-1)+f(n-2)*2;}void main(){int n;while(1){cin>>n;cout<<f(n)<<endl;}}3、北大ACM(1942)Paths on a GridTime Limit: 1000MS Memory Limit: 30000K DescriptionImagine you are attending your math lesson at school. Once again, you are bored because your teacher tells things that you already mastered years ago (this time he's explaining that (a+b)2=a2+2ab+b2). So you decide to waste your time with drawing modern art instead.Fortunately you have a piece of squared paper and you choose a rectangle of size n*m on the paper. Let's call this rectangle together with the lines it contains a grid. Starting at the lower left corner of the grid, you move your pencil to the upper right corner, taking care that it stays on the lines and moves only to the right or up. The result is shown on the left:Really a masterpiece, isn't it? Repeating the procedure one more time, you arrive with the picture shown on the right. Now you wonder: how many different works of art can you produce?InputThe input contains several testcases. Each is specified by two unsigned 32-bit integers n and m, denoting the size of the rectangle. As you can observe, the number of lines of the corresponding grid is one more in each dimension. Input is terminated by n=m=0.OutputFor each test case output on a line the number of different art works that can be generated using the procedure described above. That is, how many paths are there on a grid where each step of the path consists of moving one unit to the right orone unit up? You may safely assume that this number fits into a 32-bit unsigned integer.Sample Input5 41 10 0Sample Output1262#include<iostream>using namespace std;long long f(long long m, long long n){if(n==0) return 1;else return f(m-1,n-1)*m/n;}int main(){long long m,n;while(scanf("%I64d %I64d",&n,&m) && n+m){printf("%I64d\n",f(m+n,min(m,n)));}return 0;}1、北大ACM(1012)JosephTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 31213 Accepted: 11700 DescriptionThe Joseph's problem is notoriously known. For those who are not familiar with the original problem: from among n people, numbered 1, 2, . . ., n, standing in circle every mth is going to be executed and only the life of the last remaining person will be saved. Joseph was smart enough to choose the position of the last remaining person, thus saving his life to give us the message about the incident. For example when n = 6 and m = 5 then the people will be executed in the order 5, 4, 6, 2, 3 and 1 will be saved.Suppose that there are k good guys and k bad guys. In the circle the first k are good guys and the last k bad guys. You have to determine such minimal m that all the bad guys will be executed before the first good guy.题目大意:编号为1,2…, n的n个人排成一圈,从第一个人开始,去掉后面的第m个人,在从第m+1个人开始去掉后面第m个人,以此类推。
acm竞赛试题及答案ACM竞赛试题及答案1. 问题描述:给定一个整数数组,找出数组中没有出现的最小的正整数。
2. 输入格式:第一行包含一个整数n,表示数组的长度。
第二行包含n个整数,表示数组的元素。
3. 输出格式:输出一个整数,表示数组中没有出现的最小的正整数。
4. 样例输入:53 4 1 2 55. 样例输出:66. 问题分析:首先,我们需要理解题目要求我们找出数组中缺失的最小正整数。
这意味着我们需要检查数组中的每个元素,并确定最小的正整数是否在数组中。
7. 算法描述:- 遍历数组,使用一个哈希集合记录出现的数字。
- 从1开始,检查每个正整数是否在哈希集合中,直到找到不在集合中的最小正整数。
8. 代码实现:```pythondef find_missing_positive(nums):seen = set()for num in nums:if num <= 0:continuewhile num in seen or num > len(nums):num += 1seen.add(num)return min(set(range(1, len(nums) + 1)) - seen)```9. 测试用例:- 输入:[3, 4, -1, 1]- 输出:210. 答案解析:在给定的测试用例中,数组[3, 4, -1, 1]中没有出现的最小正整数是2。
这是因为-1不是正整数,所以可以忽略。
数组中已经出现了1和3,所以下一个最小的正整数就是2。
11. 注意事项:- 确保数组中的元素是整数。
- 考虑数组中可能包含0或负数的情况。
- 算法的时间复杂度应尽可能低。
12. 扩展思考:- 如果数组非常大,如何优化算法?- 如果数组中的元素可以是浮点数,算法应该如何修改?13. 参考答案:- 针对大数组,可以考虑使用更高效的数据结构,如平衡二叉搜索树。
- 如果元素是浮点数,需要先将其转换为整数,然后再进行处理。
acm大赛试题及答案ACM大赛试题及答案1. 题目一:字符串反转问题描述:编写一个程序,输入一个字符串,输出其反转后的字符串。
输入格式:输入包含一个字符串,字符串长度不超过100。
输出格式:输出反转后的字符串。
示例:输入:hello输出:olleh答案:```pythondef reverse_string(s):return s[::-1]input_string = input().strip()print(reverse_string(input_string))```2. 题目二:计算阶乘问题描述:编写一个程序,输入一个非负整数n,输出n的阶乘。
输入格式:输入包含一个非负整数n,n不超过20。
输出格式:输出n的阶乘。
示例:输入:5输出:120答案:```pythondef factorial(n):if n == 0:return 1else:return n * factorial(n - 1)n = int(input())print(factorial(n))```3. 题目三:寻找最大数问题描述:给定一个包含n个整数的数组,找出数组中的最大数。
输入格式:输入包含一个整数n,表示数组的大小,随后是n个整数。
输出格式:输出数组中的最大数。
示例:输入:5 1 2 3 4 5输出:5答案:```pythonn = int(input())numbers = list(map(int, input().split()))max_number = max(numbers)print(max_number)```4. 题目四:判断闰年问题描述:编写一个程序,输入一个年份,判断该年份是否为闰年。
输入格式:输入包含一个整数,表示年份。
输出格式:如果输入的年份是闰年,则输出"Yes",否则输出"No"。
示例:输入:2000输出:Yes答案:```pythonyear = int(input())if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):print("Yes")else:print("No")```5. 题目五:斐波那契数列问题描述:编写一个程序,输入一个非负整数n,输出斐波那契数列的第n项。
1000 A + B ProblemProblem DescriptionCalculate A + B.InputEach line will contain two integers A and B. Process to end of file.OutputFor each case, output A + B in one line.Sample Input1 1Sample Output2AuthorHDOJ代码:#include<stdio.h>int main(){int a,b;while(scanf("%d %d",&a,&b)!=EOF)printf("%d\n",a+b);}1001 Sum ProblemProblem DescriptionHey, welcome to HDOJ(Hangzhou Dianzi University Online Judge).In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n.InputThe input will consist of a series of integers n, one integer per line.OutputFor each case, output SUM(n) in one line, followed by a blank line. You may assume the result will be in the range of 32-bit signed integer.Sample Input1100Sample Output15050AuthorDOOM III解答:#include<stdio.h>main(){int n,i,sum;sum=0;while((scanf("%d",&n)!=-1)){sum=0;for(i=0;i<=n;i++)sum+=i;printf("%d\n\n",sum);}}1002 A + B Problem IIProblem DescriptionI have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B. InputThe first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line consists of two positive integers, A and B. Notice that the integers are very large, that means you should not process them by using 32-bit integer. You may assume the length of each integer will not exceed 1000. OutputFor each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line is the an equation "A + B = Sum", Sum means the result of A + B. Note there are some spaces int the equation. Output a blank line between two test cases.Sample Input21 2112233445566778899 998877665544332211Sample OutputCase 1:1 +2 = 3Case 2:112233445566778899 + 998877665544332211 = 1111111111111111110AuthorIgnatius.L代码:#include <stdio.h>#include <string.h>int main(){char str1[1001], str2[1001];int t, i, len_str1, len_str2, len_max, num = 1, k;scanf("%d", &t);getchar();while(t--){int a[1001] = {0}, b[1001] = {0}, c[1001] = {0}; scanf("%s", str1);len_str1 = strlen(str1);for(i = 0; i <= len_str1 - 1; ++i)a[i] = str1[len_str1 - 1 - i] - '0';scanf("%s",str2);len_str2 = strlen(str2);for(i = 0; i <= len_str2 - 1; ++i)b[i] = str2[len_str2 - 1 - i] - '0';if(len_str1 > len_str2)len_max = len_str1;elselen_max = len_str2;k = 0;for(i = 0; i <= len_max - 1; ++i){c[i] = (a[i] + b[i] + k) % 10;k = (a[i] + b[i] + k) / 10;}if(k != 0)c[len_max] = 1;printf("Case %d:\n", num);num++;printf("%s + %s = ", str1, str2);if(c[len_max] == 1)printf("1");for(i = len_max - 1; i >= 0; --i){printf("%d", c[i]);}printf("\n");if(t >= 1)printf("\n");}return 0;}1005 Number Sequence Problem DescriptionA number sequence is defined as follows:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.Given A, B, and n, you are to calculate the value of f(n).InputThe input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed. OutputFor each test case, print the value of f(n) on a single line.Sample Input1 1 31 2 100 0 0Sample Output25AuthorCHEN, ShunbaoSourceRecommendJGShining代码:#include<stdio.h>int f[200];int main(){int a,b,n,i;while(scanf("%d%d%d",&a,&b,&n)&&a&&b&&n){if(n>=3){f[1]=1;f[2]=1;for(i=3;i<=200;i++){f[i]=(a*f[i-1]+b*f[i-2])%7;if(f[i-1]==1&&f[i]==1)break;}i-=2;n=n%i;if(n==0)printf("%d\n",f[i]);elseprintf("%d\n",f[n]);}elseprintf("1\n");}return 0;}1008 ElevatorProblem DescriptionThe highest building in our city has only one elevator. A request list is made up with N positive numbers. The numbers denote at which floors the elevator will stop, in specified order. It costs 6 seconds to move the elevator up one floor, and 4 seconds to move down one floor. The elevator will stay for 5 seconds at each stop.For a given request list, you are to compute the total time spent to fulfill the requests on the list. The elevator is on the 0th floor at the beginning and does not have to return to the ground floor when the requests are fulfilled.InputThere are multiple test cases. Each case contains a positive integer N, followed by N positive numbers. All the numbers in the input are less than 100. A test case with N = 0 denotes the end of input. This test case is not to be processed.OutputPrint the total time on a single line for each test case.Sample Input1 23 2 3 1Sample Output1741AuthorZHENG, JianqiangSourceRecommendJGShining代码:#include<stdio.h>int a[110];int main(){int sum,i,n;while(scanf("%d",&n)&&n!=0){for(i=1;i<=n;i++)scanf("%d",&a[i]);sum=0;a[0]=0;for(i=1;i<=n;i++){if(a[i]>a[i-1])sum+=6*(a[i]-a[i-1]);elsesum+=4*(a[i-1]-a[i]);sum+=5;}printf("%d\n",sum);}return 0;}1009 FatMouse' TradeProblem DescriptionFatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean.The warehouse has N rooms. The i-th room contains J[i] pounds of JavaBeans and requires F[i] pounds of cat food. FatMouse does not have to trade for all the JavaBeans in the room, instead, he may get J[i]* a% pounds of JavaBeans if he pays F[i]* a% pounds of cat food. Here a is a real number. Now he is assigning this homework to you: tell him the maximum amount of JavaBeans he can obtain.InputThe input consists of multiple test cases. Each test case begins with a line containing two non-negative integers M and N. Then N lines follow, each contains two non-negative integers J[i] and F[i] respectively. The last test case is followed by two -1's. All integers are not greater than 1000.OutputFor each test case, print in a single line a real number accurate up to 3 decimal places, which is the maximum amount of JavaBeans that FatMouse can obtain.Sample Input5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1Sample Output13.333 31.500AuthorCHEN, YueSourceRecommendJGShining代码:#include<stdio.h>#include<string.h>#define MAX 1000int main(){int i,j,m,n,temp;int J[MAX],F[MAX];double P[MAX];double sum,temp1;scanf("%d%d",&m,&n);while(m!=-1&&n!=-1){sum=0;memset(J,0,MAX*sizeof(int));memset(F,0,MAX*sizeof(int));memset(P,0,MAX*sizeof(double));for(i=0;i<n;i++){ scanf("%d%d",&J[i],&F[i]); P[i]=J[i]*1.0/((double)F[i]); }for(i=0;i<n;i++){for(j=i+1;j<n;j++){if(P[i]<P[j]){temp1=P[i]; P[i]=P[j]; P[j]=temp1;temp=J[i]; J[i]=J[j]; J[j]=temp;temp=F[i]; F[i]=F[j]; F[j]=temp;}}}for(i=0;i<n;i++){if(m<F[i]){ sum+=m/((double)F[i])*J[i]; break; }else { sum+=J[i]; m-=F[i]; }}printf("%.3lf\n",sum); scanf("%d%d",&m,&n);}return 0;}1021 Fibonacci Again Problem DescriptionThere are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2). InputInput consists of a sequence of lines, each containing an integer n. (n < 1,000,000).OutputPrint the word "yes" if 3 divide evenly into F(n).Print the word "no" if not.Sample Input12345Sample OutputnonoyesnononoAuthorLeojayRecommendJGShining#include<stdio.h>int main(){long n;while(scanf("%ld",&n) != EOF)if (n%8==2 || n%8==6)printf("yes\n");elseprintf("no\n");return 0;}1089 A+B for Input-Output Practice (I) Problem DescriptionYour task is to Calculate a + b.Too easy?! Of course! I specially designed the problem for acm beginners.You must have found that some problems have the same titles with this one, yes, all these problems were designed for the same aim.InputThe input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line. OutputFor each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.Sample Input1 510 20Sample Output630AuthorlcyRecommendJGShining解答:#include<stdio.h>main(){int a,b;while(scanf("%d%d",&a,&b)!=EOF)printf("%d\n",a+b);}1090 A+B for Input-Output Practice (II) Problem DescriptionYour task is to Calculate a + b.InputInput contains an integer N in the first line, and then N lines follow. Each line consists of a pair of integers a and b, separated by a space, one pair of integers per line.OutputFor each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.Sample Input21 510 20Sample Output630AuthorlcyRecommendJGShining解答:#include<stdio.h>#define M 1000void main(){int a ,b,n,j[M],i;//printf("please input n:\n");scanf("%d",&n);for(i=0;i<n;i++){scanf("%d%d",&a,&b);//printf("%d %d",a,b);j[i]=a+b;}i=0;while(i<n){printf("%d",j[i]);i++;printf("\n");}}1091 A+B for Input-Output Practice (III) Problem DescriptionYour task is to Calculate a + b.InputInput contains multiple test cases. Each test case contains a pair of integers a and b, one pair of integers per line. A test case containing 0 0 terminates the input and this test case is not to be processed.OutputFor each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.Sample Input1 510 200 0Sample Output630AuthorlcyRecommendJGShining解答:#include<stdio.h>main(){int a,b;scanf("%d %d",&a,&b);while(!(a==0&&b==0)){printf("%d\n",a+b);scanf("%d %d",&a,&b);}}1092 A+B for Input-Output Practice (IV) Problem DescriptionYour task is to Calculate the sum of some integers.InputInput contains multiple test cases. Each test case contains a integer N, and then N integers follow in the same line. A test case starting with 0 terminates the input and this test case is not to be processed.OutputFor each group of input integers you should output their sum in one line, and with one line of output for each line in input.。
饨力水年提供三一、选择题:(每小题7分,共42分)1 •在凸2005边形中,不大于111°的内角最多有()(A)3个(B)4个(0 5 个(D) 6 个2.已知均为实数,且关于兀的不等式|(G +2)X-2G +1| vb的解集为-l<x<3,则a + b的值为:()(A)3 或7 (B)3 或13 (07 或8 (D)8 或133.满足y = VxTl + Vx + 2005 的正整数对(x,y)( )(A)只有一对(B)恰有两对(C)至少有三对(D)不存在4.设知忑是方程亍-2003x + 2005 = 0的两个实根,实数满足:血严彳+ /?x22003 = 2003, ^2004 + bx^ = 2004,则or;005 + Z?x22005的值为( )5.在同一平面上,正方形ABCD的四个顶点到直线/的距离只取四个值,其屮一个值是另一个值的3倍,这样的肓线/可以有()(A)4条⑻8条(012条(D)16条二、填空题:(满分28分,每小题7分)6.抛物线y = ax2与直线x = l,x = 2,y = l,y = 2组成的正方形有公共点,贝U a的取值范围是__________ ・7.如图,D为△ ABC的边BC上一点,P为线段AD上一点,若若△ APB的面积为9,A CPD的而积为16,则A ABC而积的最小值是______8. __________________ 在由△ ABC内的2005个点P b P2,……P2W)5及△ ABC的三个顶点A, B, C共2008个点所构成的三角形中,最多有个三角形,它们恰好将△ ABC完全分割成无任何重叠的三角形.(A)2005 (B)2003 (0 -2005 (D) -20039.如果点P将。
0的弦AB和CI)分成的四条线段PA, PB, PC, PD的长度恰好是四个互不相同的正整数,则称点P为00的”整分点” •现已知M是半径为5的。
ACM软件大赛之编程大赛比赛注意事项:●比赛时间为3小时(180分钟);比赛分两个阶段:第一阶段限时30分钟,完成公示的3题,第二阶段限时150分钟(事先完成第一阶段题目的小组可提前进入第二阶段);●比赛第一阶段的3道题目将在前期宣传中告知参赛选手,比赛第二阶段的题目将由赛事主席当场公布竞赛题目;●前两阶段题目分为三个分值(5分、10分、15分),第一阶段3道公示题都为5分;第二阶段总共15道题,根据不同的难度分值不同,分别为5道5分题,5道10分题,5道15分题;第一阶段参赛队员不可参考任何相关资料;第二阶段参赛队员可以携带诸如书,手册,程序清单等参考资料。
比赛过程中队员不得携带任何电子媒质的资料;参赛者可以选择自己擅长的语言(C,C++,JAVA等等)进行编写●考虑到大一和大二学生的知识掌握程度,大一参加选手一开始就会有10分的分数,最后总分是由所做题目及初始的10分相加得到。
●每组队员根据安排使用电脑,小组人数为两人的使用一台电脑,超过两人的使用两台电脑,每台的电脑配置完全相同;●各小组每做完一题或几题,必须交予评委老师运行,评委老师当场给分;●如在比赛中发现作弊等行为,将取消比赛资格。
第一阶段公示题目:题目一:(5分)打印以下图形,纵遵从字母顺序,行字符数遵从斐波那契数列ABCCDDDEEEEEFFFFFFFFGGGGGGGGGGGGG#include<iostream>int f(int x){int a = 1 , b = 0;int max_ = x;int sum = 0;for(int i = 0; i < max_ ; i++){sum = a + b;a = b;b = sum;}return sum;}void loop_print(int num,char chr){for(int i = 0; i < num ;i++)std::cout<<chr;std::cout<<"\n";}int main(){int line_max = 7;char chr = 'A';for(int line = 0; line < line_max; line++){loop_print(f(line+1),chr);chr++;}return 0;}题目二:(5分)有个电子钟,12点显示为12:00(即12小时制),那么请问一天24时间内,出现连续3个相同数字的钟点有几个?#include<iostream>using namespace std;bool check(int time){int h=time/100;int m=time-100*h;return h<=12&&m<=59&&h>0?true:false;//12小时制}int main(){int time=0;int j(0);//总计数器while(time<1270){//max 12:59int t=time;int n[4];for(int i=0;i<4;i++){n[i]=t%10;t /= 10;}if(n[1]==n[2]&&(n[0]==n[1]||n[3]==n[1])&&check(time)){//cout<<n[3]<<n[2]<<":"<<n[1]<<n[0]<<"\n";//testj++;}time++;}cout<<"total: "<<j*2<<endl;}题目三:(5分)10进制的四位数中有几个符合如下特征:将其分别表示为16进制、10进制、12进制,在每种状态下,分别将各个位上的数相加,能得到3个相等10进制数。
大一acm竞赛试题及答案一、选择题(每题5分,共20分)1. 下列哪个算法的时间复杂度为O(n^2)?A. 快速排序B. 归并排序C. 插入排序D. 冒泡排序答案:C2. 在C++中,下列哪个关键字用于定义类?A. structB. classC. unionD. enum答案:B3. 下列哪个数据结构适合用于实现稀疏矩阵?A. 顺序存储B. 链式存储C. 压缩存储D. 散列存储答案:C4. 在图论中,下列哪个算法用于寻找最短路径?A. 深度优先搜索B. 广度优先搜索C. 迪杰斯特拉算法D. 弗洛伊德算法二、填空题(每题5分,共20分)1. 在二叉树的遍历算法中,______遍历会先访问根节点。
答案:前序2. 哈希表的冲突解决方法之一是______。
答案:链地址法3. 在数据库中,用于实现一对多关系的表结构是______。
答案:外键4. 动态规划算法的核心是______。
答案:状态转移方程三、编程题(每题30分,共60分)1. 编写一个函数,实现对一个整数数组进行排序,并返回排序后的数组。
答案:```pythondef sort_array(arr):arr.sort()return arr```2. 编写一个函数,实现计算给定整数n的阶乘。
答案:```pythondef factorial(n):if n == 0:return 1return n * factorial(n - 1)```四、算法题(每题30分,共30分)1. 给定一个整数数组,请设计一个算法找出数组中第二大的数。
答案:```pythondef find_second_max(nums):first_max = second_max = float('-inf')for num in nums:if num > first_max:second_max = first_maxfirst_max = numelif num > second_max and num != first_max:second_max = numreturn second_max```。
Acm试题及答案Acm试题及答案1001 Sum Problem (2)1089 A+B for Input-Output Practice (I) (3) 1090 A+B for Input-Output Practice (II) (4) 1091A+B for Input-Output Practice (III) (6) 1092A+B for Input-Output Practice (IV) (7) 1093 A+B for Input-Output Practice (V) (9) 1094 A+B for Input-Output Practice (VI) (11) 1095A+B for Input-Output Practice (VII) (12) 1096 A+B for Input-Output Practice (VIII) (14) 2000 ASCII码排序 (15)2001计算两点间的距离 (16)2002计算球体积 (17)2003求绝对值 (18)2004成绩转换 (19)2005第几天? (20)2006求奇数的乘积 (22)2007平方和与立方和 (23)2008数值统计 (24)2009求数列的和 (25)2010水仙花数 (27)2011多项式求和 (28)2012素数判定 (29)2014青年歌手大奖赛_评委会打分 (31)2015偶数求和 (32)2016数据的交换输出 (34)2017字符串统计 (35)2019数列有序! (37)2020绝对值排序 (38)2021发工资咯:) (40)2033人见人爱A+B (41)2039三角形 (43)2040亲和数 (44)1001 Sum ProblemProblem DescriptionHey, welcome to HDOJ(Hangzhou Dianzi University Online Judge).In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n.InputThe input will consist of a series of integers n, one integer per line.OutputFor each case, output SUM(n) in one line, followed by a blank line. You may assume the result will be in the range of 32-bit signed integer.Sample Input1100Sample Output15050AuthorDOOM III解答:#includemain(){int n,i,sum;sum=0;while((scanf("%d",&n)!=-1)){sum=0;for(i=0;i<=n;i++)sum+=i;printf("%d\n\n",sum);}}1089 A+B for Input-Output Practice(I)Problem DescriptionYour task is to Calculate a + b.Too easy?! Of course! I specially designed the problem for acm beginners.You must have found that some problems have the same titles with this one, yes, all these problems were designed for the same aim.InputThe input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line.OutputFor each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.Sample Input1 510 20Sample Output630AuthorlcyRecommendJGShining解答:#includemain(){int a,b;while(scanf("%d%d",&a,&b)!=EOF)printf("%d\n",a+b);}1090 A+B for Input-Output Practice(II)Problem DescriptionYour task is to Calculate a + b.InputInput contains an integer N in the first line, and then N lines follow. Each line consists of a pair of integers a and b, separated by a space, one pair of integers per line.OutputFor each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.Sample Input21 510 20Sample Output630AuthorlcyRecommendJGShining解答:#include#define M 1000void main(){int a ,b,n,j[M],i;//printf("please input n:\n");scanf("%d",&n);for(i=0;i<n;i++)< bdsfid="216" p=""></n;i++)<> {scanf("%d%d",&a,&b);//printf("%d %d",a,b);j[i]=a+b;}i=0;while(i<n)< bdsfid="224" p=""></n)<>{printf("%d",j[i]); i++;printf("\n");}}1091A+B for Input-Output Practice (III) Problem DescriptionYour task is to Calculate a + b.InputInput contains multiple test cases. Each test case contains a pair of integers a and b, one pair of integers per line. A test case containing 0 0 terminates the input and this test case is not to be processed.OutputFor each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.Sample Input1 510 200 0Sample Output630AuthorlcyRecommendJGShining解答:#includemain(){int a,b;scanf("%d %d",&a,&b);while(!(a==0&&b==0)){printf("%d\n",a+b);scanf("%d %d",&a,&b);}}1092A+B for Input-Output Practice (IV)Problem DescriptionYour task is to Calculate the sum of some integers.InputInput contains multiple test cases. Each test case contains a integer N, and then N integers followin the same line. A test case starting with 0 terminates the input and this test case is not to be processed.OutputFor each group of input integers you should output their sum in one line, and with one line of output for each line in input.Sample Input4 1 2 3 45 1 2 3 4 5Sample Output1015AuthorlcyRecommendJGShining解答:#includeint main(){int n,sum,i,t;while(scanf("%d",&n)!=EOF&&n!=0)sum=0;for(i=0;i<n;i++)< bdsfid="290" p=""></n;i++)<>{scanf("%d",&t);sum=sum+t;}printf("%d\n",sum); }1093 A+B for Input-Output Practice (V)Problem DescriptionYour task is to calculate the sum of some integers.InputInput contains an integer N in the first line, and then N lines follow. Each line starts with a integer M, and then M integers follow in the same line.OutputFor each group of input integers you should output their sum in one line, and with one line of output for each line in input.Sample Input24 1 2 3 45 1 2 3 4 5Sample Output1015Authorlcy解答:#includemain()int n,a,b,i,j,sum;sum=0;while(scanf("%d\n",&n)!=-1){for(i=0;i<n;i++)< bdsfid="322" p=""></n;i++)<>{scanf("%d",&b);for(j=0;j<b;j++)< bdsfid="326" p=""></b;j++)<>{scanf("%d",&a);sum+=a;}printf("%d\n",sum); sum=0;}}}1094 A+B for Input-Output Practice(VI)Problem DescriptionYour task is to calculate the sum of some integers.InputInput contains multiple test cases, and one case one line. Each case starts with an integer N, and then N integers follow in the same line.OutputFor each test case you should output the sum of N integers in one line, and with one line of output for each line in input.Sample Input4 1 2 3 45 1 2 3 4 5Sample Output1015AuthorlcyRecommendJGShining解答:#includemain(){int n,a,b,i,j,sum;sum=0;while(scanf("%d\n",&n)!=-1) {for(j=0;j<n;j++)< bdsfid="362" p=""></n;j++)<>{scanf("%d",&a);sum+=a;}printf("%d\n",sum); sum=0;}}1095A+B for Input-Output Practice (VII)Problem DescriptionYour task is to Calculate a + b.InputThe input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line.OutputFor each pair of input integers a and b you should output the sum of a and b, and followed by a blank line.Sample Input1 510 20Sample Output630AuthorlcyRecommendJGShining解答:#includemain(){int a,b;while(scanf("%d%d",&a,&b)!=EOF)printf("%d\n\n",a+b);}1096 A+B for Input-Output Practice(VIII)Problem DescriptionYour task is to calculate the sum of some integers.InputInput contains an integer N in the first line, and then N lines follow. Each line starts with a integer M, and then M integers follow in the same line.OutputFor each group of input integers you should output their sumin one line, and you must note that there is a blank line between outputs.Sample Input34 1 2 3 45 1 2 3 4 53 1 2 3Sample Output10156AuthorlcyRecommendJGShining解答:int main(){int a,b,i,j,l[1000],k;scanf("%d",&i);getchar();for(j=1;j<=i;j++)l[j]=0;for(j=1;j<=i;j++){scanf("%d",&a);getchar();for(k=1;k<=a;k++){scanf("%d",&b);getchar();l[j]+=b;}}for(j=1;j<=i-1;j++)printf("%d\n\n",l[j]);printf("%d\n",l[i]);}2000 ASCII码排序Problem Description输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
ICPC2017南宁站题解(A,E,F,H,I,J,L,M)VP⽐赛时间:2020-07-23: 7 / 13 Rank: 35 / 228VP通过:A,E,F,H,I,J,L赛后补题:M感想:这场对⼤数要求挺多(2道题F和L),我队Java选⼿很给⼒。
然后银牌题⼤概是E和M(M那时候没信⼼去挑战毕竟在银⾸,但是赛后补题发现是⼀个floyd+裸最⼤独⽴集,还是简单题。
E是偏向思维的概率数学)。
H是⼤模拟,I题是⽆脑dfs模拟。
就这场和icpc2019南昌来说,我感觉银牌图论题可能要求并不是很⾼,要有信⼼去挑战银牌题吧。
毕竟感觉铜牌图论撑死就是⽣成树和最短路了(真的吗?)A.Abiyoyo第⼀签到题,Anonytt,懒得说:#include<bits/stdc++.h>#define ll long long#define rep(i,a,n) for(int i=a;i<=n;i++)#define per(i,n,a) for(int i=n;i>=a;i--)#define endl '\n'#define eps 0.000000001#define pb push_back#define mem(a,b) memset(a,b,sizeof(a))#define IO ios::sync_with_stdio(false);cin.tie(0);using namespace std;const int INF=0x3f3f3f3f;const ll inf=0x3f3f3f3f3f3f3f3f;const int mod=1e9+7;const int maxn=1e5+5;int main(){int T;cin>>T;while(T--){int n;cin>>n;rep(i,1,n){puts("Abiyoyo, Abiyoyo.");}rep(i,1,2){puts("Abiyoyo, yo yoyo yo yoyo.");}}}View CodeE. The Champion银牌题,Libm,我不会。
acm考试题目及答案1. 题目:给定一个整数数组,找出数组中没有出现的最小的正整数。
答案:首先,我们可以遍历数组,将每个元素与它的索引对应起来,即如果数组中存在数字`i`,则将其与索引`i-1`对应。
然后,我们可以遍历数组,检查索引`i`是否与数组中第`i`个元素相等。
如果不相等,则索引`i`对应的值就是没有出现的最小正整数。
如果所有元素都与其索引对应,则没有出现的最小正整数为数组长度加1。
2. 题目:实现一个函数,检查一个链表是否为回文结构。
答案:我们可以将链表的前半部分反转,然后比较反转后的前半部分与后半部分是否相同。
如果相同,则链表是回文的;如果不相同,则不是。
具体步骤如下:首先找到链表的中点,然后反转前半部分链表,接着比较反转后的前半部分与后半部分是否相同,最后将前半部分链表再次反转回来。
3. 题目:给定一个只包含 '(' 和 ')' 的字符串,判断字符串是否有效。
答案:我们可以使用一个栈来解决这个问题。
遍历字符串中的每个字符,如果遇到'(',则将其压入栈中;如果遇到')',则检查栈是否为空,如果为空,则字符串无效;如果不为空,则弹出栈顶元素。
遍历结束后,如果栈为空,则字符串有效;如果栈不为空,则字符串无效。
4. 题目:找出一个无序数组中第k大的元素。
答案:我们可以使用快速选择算法来解决这个问题。
首先,选择一个元素作为基准,然后将数组分为两部分:一部分是大于基准的元素,另一部分是小于基准的元素。
根据基准的位置,我们可以确定第k大的元素是在基准的左边还是右边,然后递归地在相应的部分中寻找第k大的元素。
重复这个过程,直到找到第k大的元素。
5. 题目:给定一个字符串,找出其中不含有重复字符的最长子串的长度。
答案:我们可以使用滑动窗口的方法来解决这个问题。
维护一个窗口,记录窗口内字符的出现情况。
遍历字符串,如果遇到重复的字符,则移动窗口的左边界,直到窗口内没有重复的字符。
ACM程序设计试题及参考答案猪的安家Andy和Mary养了很多猪。
他们想要给猪安家。
但是Andy没有足够的猪圈,很多猪只能够在一个猪圈安家。
举个例子,假如有16头猪,Andy建了3个猪圈,为了保证公平,剩下1头猪就没有地方安家了。
Mary生气了,骂Andy没有脑子,并让他重新建立猪圈。
这回Andy建造了5个猪圈,但是仍然有1头猪没有地方去,然后Andy又建造了7个猪圈,但是还有2头没有地方去。
Andy都快疯了。
你对这个事情感兴趣起来,你想通过Andy建造猪圈的过程,知道Andy家至少养了多少头猪。
输入输入包含多组测试数据。
每组数据第一行包含一个整数n (n <= 10) – Andy 建立猪圈的次数,解下来n行,每行两个整数ai, bi( bi <= ai <= 1000), 表示Andy建立了ai个猪圈,有bi头猪没有去处。
你可以假定(ai, aj) = 1.输出输出包含一个正整数,即为Andy家至少养猪的数目。
样例输入33 15 17 2样例输出16答案:// 猪的安家.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "iostream.h"void main(){int n;int s[10][2];bool r[10];char ch;cout<<"请输入次数:"<<endl;cin>>n;for (int i=0;i<n;i++){cout<<"请输入第"<<i+1<<"次的猪圈个数和剩下的猪:,用--分开,"<<endl;cin>>s[i][0]>>ch>>ch>>s[i][1];}for (i=0;i<10;i++)r[i]=true;for (int sum=1;;sum++){for (i=0;i<n;i++)r[i]=(sum%s[i][0]==s[i][1]);for (i=0;i<n;i++){if (r[i]==0)break;}if (i==n)break;}cout<<"猪至少有"<<sum<<"只。
2017浙江省赛⼤学⽣程序设计竞赛C题WhatKindofFriendsAreYou?What Kind of Friends Are You?Time Limit: 1 Second Memory Limit: 65536 KBJapari Park is a large zoo home to extant species, endangered species, extinct species, cryptids and some legendary creatures. Due to a mysterious substance known as Sandstar, all the animals have become anthropomorphized into girls known as Friends.Kaban is a young girl who finds herself in Japari Park with no memory of who she was or where she came from. Shy yet resourceful, she travels through Japari Park along with Serval to find out her identity while encountering more Friends along the way, and eventually discovers that she is a human.However, Kaban soon finds that it's also important to identify other Friends. Her friend, Serval, enlightens Kaban that she can use some questions whose expected answers are either "yes" or "no" to identitfy a kind of Friends.To be more specific, there are n Friends need to be identified. Kaban will ask each of them q same questions and collect their answers. For each question, she also gets a full list of animals' names that will give a "yes" answer to that question (and those animals who are not in the list will give a "no" answer to that question), so it's possible to determine the name of a Friends by combining the answers and the lists together.But the work is too heavy for Kaban. Can you help her to finish it?InputThere are multiple test cases. The first line of the input is an integer T (1 ≤ T ≤ 100), indicating the number of test cases. Then T test cases follow.The first line of each test case contains two integers n (1 ≤ n ≤ 100) and q (1 ≤ q ≤ 21), indicating the number of Friends need to be identified and the number of questions.The next line contains an integer c (1 ≤ c ≤ 200) followed by c strings p1, p2, ... , p c (1 ≤ |p i| ≤ 20), indicating all known names of Friends. For the next q lines, the i-th line contains an integer m i (0 ≤ m i ≤ c) followed by m i strings s i, 1, s i, 2, ... , s i, m(1 ≤ |s i, j| ≤ 20), indicating theinumber of Friends and their names, who will give a "yes" answer to the i-th question. It's guaranteed that all the names appear in the known names of Friends.For the following n lines, the i-th line contains q integers a i, 1, a i, 2, ... , a i, q (0 ≤ a i, j ≤ 1), indicating the answer (0 means "no", and 1 means "yes") to the j-th question given by the i-th Friends need to be identified.It's guaranteed that all the names in the input consist of only uppercase and lowercase English letters.OutputFor each test case output n lines. If Kaban can determine the name of the i-th Friends need to be identified, print the name on the i-th line. Otherwise, print "Let's go to the library!!" (without quotes) on the i-th line instead.Sample Input23 45 Serval Raccoon Fennec Alpaca Moose4 Serval Raccoon Alpaca Moose1 Serval1 Fennec1 Serval1 1 0 10 0 0 01 0 0 05 511 A B C D E F G H I J K3 A B K4 A B D E5 A B K D E10 A B K D E F G H I J4 B D E K0 0 1 1 11 0 1 0 11 1 1 1 10 0 1 0 11 0 1 1 1Sample OutputServalLet's go to the library!!Let's go to the library!!Let's go to the library!!Let's go to the library!!BLet's go to the library!!KHintThe explanation for the first sample test case is given as follows:As Serval is the only known animal who gives a "yes" answer to the 1st, 2nd and 4th question, and gives a "no" answer to the 3rd question, we output "Serval" (without quotes) on the first line.As no animal is known to give a "no" answer to all the questions, we output "Let's go to the library!!" (without quotes) on the second line. Both Alpaca and Moose give a "yes" answer to the 1st question, and a "no" answer to the 2nd, 3rd and 4th question. So we can't determine the name of the third Friends need to be identified, and output "Let's go to the library!!" (without quotes) on the third line.简单模拟,并不会超时#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<algorithm>#include<iostream>#include<queue>#include<map>#include<cmath>#include<set>#include<stack>#define ll long long#define max(x,y) (x)>(y)?(x):(y)#define min(x,y) (x)>(y)?(y):(x)#define cls(name,x) memset(name,x,sizeof(name))using namespace std;const int inf=1<<28;const int maxn=110;const int maxm=1e2+10;const int mod=1e9+7;const double pi=acos(-1.0);int n,q;int c;bool save[30][210];void mul(bool a[],bool b[],int key){for(int i=1;i<=c;i++)a[i]=a[i]&(key==1?(b[i]):(!b[i]));}int main(){//freopen("in.txt","r",stdin);int ncas;scanf("%d",&ncas);while(ncas--){map<string,int> mapp;scanf("%d%d",&n,&q);scanf("%d",&c);char names[210][30];for(int i=1;i<=c;i++){scanf("%s",names[i]);mapp[names[i]]=i;}cls(save,0);for(int i=1;i<=q;i++){int k;scanf("%d",&k);while(k--){char name[30];scanf("%s",name);save[i][mapp[name]]=1;}}for(int i=1;i<=n;i++){bool ans[210];cls(ans,1);for(int j=1;j<=q;j++){int temp;scanf("%d",&temp);mul(ans,save[j],temp);}int ansc=0,ansk=0;for(int k=1;k<=c;k++){if(ans[k]==1){ansc++;ansk=k;}}if(ansc!=1)printf("Let's go to the library!!\n");elseprintf("%s\n",names[ansk]);}}return0;}。
2017ACM-ICPC亚洲区域赛北京站J题PanguandStones题解区间DP题⽬描述在中国古代神话中,盘古是时间第⼀个⼈并且开天辟地,它从混沌中醒来并把混沌分为天地。
刚开始地上是没有⼭的,只有满地的⽯头。
这⾥有N堆⽯头,标号为从 1 到N。
盘古想要把它们合成⼀堆建造⼀座⼤⼭。
如果某些堆⽯头的数量总和是S,盘古需要S秒才能把它们合成⼀堆,这新的⼀堆⽯头的数量就是S。
不幸的是,每⼀次盘古只能把连续的L到R堆⽯头合并成⼀堆。
盘古希望尽快把所有⽯头合成⼀堆。
你能帮帮他吗?如果没有解,则输出 0 。
解题思路可以把合并所有⽯头的过程拆分成⼏个⼦步骤,⾸先合并连续的⼀些,然后再合并连续的⼀些,⼤区间的结果可以由⼩区间推出,所以就从⼩区间开始考虑,逐步推向⼤区间,可以⽤dp[i][j][k]表⽰区间[i,j]分成k堆得最⼩代价,对于固定的⼀个区间,肯定是取所有情况的最⼩值,最后答案是dp[1][n][1],注意边界处理,包括刚开始的初始化。
然后就是代码处理中的⼀些细节了。
⾸先将所有的f[i][j][k]置为INF。
然后对于所有的初始状态(即f[i][j][j-i+1])都置为 0 。
因为区间 [i,j] 内本⾝就有j−i+1 个元素,所以这些元素本⾝就这么多堆,是不需要花费代价去划分的。
这就是我所说的初始状态。
然后就是合并区间了,区间合并⼀般都是⼩区间开始合并到⼤区间,我们这⾥也不例外(记忆化搜索的话就得反着来了)。
对于⼀个区间 [l,r] ,它要么是直接合并成⼀对,要么是若⼲个区间拼接到⼀起。
所以我们这⾥分情况讨论:直接合并如果区间 [l,r] 直接合并,那么合并成⼀对的最⼩代价应该是f[l][r][1] 。
那么对于区间 [l,r] ,我⼀定可以将其查分成两个区间 [l,i] 和 [i+1,r] ,其中坐区间有j个元素,右区间有 1 个元素,并且满⾜L≤j+1≤R 。
于是我们可以从l∼r−1 枚举i,从L−1∼R−1 枚举j,则f[l][r][1]=min(f[l][i][j]+f[i+1][r][1])+sum[r]−sum[l−1] 。
2017年计算机ACM编程竞赛
主办:计算机科学与技术学院
时间:2017-11-22 18:00---20:00
地点:计算机学院奋进楼4楼5机房
竞赛规则
1、比赛时间为120分钟,从18:00开始,20:00结束。
2、比赛形式为上机编程,每个小组使用三台电脑,可任选语言,同一小组不同题目可使用不同语言;
3、比赛期间可以使用自己电脑,不可查阅书籍、但禁止查阅个人U盘,禁止使用手机、电脑进行上网查询,禁止使用现有代码,违者取消比赛资格;(正式ACM中是可以携带纸质材料的,但由于本次比赛,有大量题目参考书上例题,所以就不让携带了)
4、比赛期间,如遇到设备问题,可举手示意工作人员;
5、由于机房电脑系统有重启还原功能,比赛期间请勿轻易重启电脑;
6、【重要】比赛结束后,请确认将所要提交文件拷至工作人员U盘,否则成绩无效概不负责。
提交方式
1、创建文件夹,文件夹命名格式为小组号-小组队长-组员1-组员2
2、将每一题的源程序文件夹以题目编号命名,拷贝至上述创建的文件夹中
3、在本文档中每题相应位置附上源码及截图(windows截图键:Alt+Prt sc
sysrq),拷贝至上述创建的文件夹中
4、比赛结束后将上述文件夹拷贝至工作人员U盘中,提交方算完成,提交
完成前请勿重启电脑。
注:本次比赛共14题,满分120分。
没有完成题目,但有部分解题步骤者按完成度给分。
每道题要有注释。
竞赛题目
1. 青年歌手大奖赛中,评委会给参赛选手打分。
选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
输入数据有多组,每组占一行,每行的第一个数是n(2<n<100),表示评委的人数,然后是n 个评委的打分。
(5分)
【要求】
输入数据:输入数据有多组,每组占一行,每行的第一个数是n(2<n<100)表示评委的人数,然后是n个评委的打分。
输出数据:对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。
【样例输入】
3 99 98 97
4 100 99 98 97
【样例输出】
98.00
98.50
2. 使用for循环、while循环和递归写出3个函数来计算给定数列的总和。
(5分)
【要求】
输入数据:n(表示数组长度)
一组数字(如:1,2,3,4,5)
输出数据:该组数字的和
3. 编写一个计算前100位斐波那契数的函数。
根据定义,斐波那契序列的前两位数字是0和1,随后的每个数字是前两个数字的和。
例如,前10位斐波那契数为:0,1,1,2,3,5,8,13,21,34。
(5分)
【要求】
输入数据:n(表示前n位斐波那契数列)
输出数据:n位斐波那契数列
4.实现两个矩阵的相加。
(5分)
例如: 2 3 5 3 5 6 5 8 11
3 1 6 + 1 2
4 = 4 3 10
2 6 7 2 4 6 4 10 13
【要求】
输入数据:两个矩阵数据不限
输出数据:这两个矩阵的和
5. 二分查找是一种针对有序集合的查找方法。
通过比较查找键K和数组中间元素A[M]来完成查找工作。
如果它们相等,算法结束。
否则,如果K < A[M],就对数组的前半部分执行该操作,如果K > A[M],则对数组的后半部分执行该操作。
(5分)
伪代码:
BinarySearch(A[0..N-1],K)
//实现非递归的折半查找
//输入:一个升序数组A[0…N-1]和一个查找键K
//输出:一个数组元素的下标,该元素等于K;如果没有这样一个元素,则返回-1
i <- 0; r <- n – 1
while i <= r do
m <- [(i + r) / 2]
if K = A[m] return m
else if K < A[m] r <- m – 1
else l <- m + 1
return -1
【要求】
输入数据:一个有序数组和要查找的数字
输出数据:返回查找数字的位置没有则返回-1
【样例输入】
4,5,8,9,10
8
【样例输出】
2
6. 汉诺塔。
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,请用编程实现。
(7分)
【要求】
输入数据:无
输出数据:盘子的移动过程
(例如:用abc表示三个柱子第n个盘子 a ---- b)
7. 简单计算机。
有一台功能极其简单的计算机,只能计算简单的七种指令A、B、
C、D、E、F;只有两个内存M1、M2;只有三个寄存器R1、R2、R3,六种指令的含义如下:
命令A:将内存M1的数据装到寄存器R1中;
命令B:将内存M2的数据装到寄存器R2中;
命令C:将寄存器R3的数据装到内存M1中;
命令D:将寄存器R3的数据装到内存M2中;
命令E:将寄存器R1中的数据和寄存器R2中的数据相加,结果放到寄存器R3中;
命令F:将寄存器R1中的数据和寄存器R2中的数据相减,结果放到寄存器R3中。
命令G: 输出M1和M2的值
你的任务是:设计一个程序模拟该计算机的运行(10分)
【样例输入】
100 288
ABECEDG
【样列输出】
388 388
8. 编写一个能将给定非负整数列表中的数字排列成最大数字的函数。
例如,给定[50,2,1,9],最大数字为95021。
(10分)
【要求】
输入数据:一组数字
输出数据:最大数字
9. 现设计一种算法实现如下功能,具体如下:将1~100首尾相连(即100的后面是1),输入一个1~9之间的数字n,从1开始,每数n位便去掉当前数字,直至100个数字中只余下1个。
例:取n=9,先后去掉的数字有9,18,27,36......99,8,19,29......(10分)(此题禁止使用ArrayList等动态数组类库)
【要求】
输入数据:n
输出数据:最后保留的数字。
10. 整数的分划问题。
如,对于正整数n=6,可以分划为:(10分)
6
5+1
4+2, 4+1+1
3+3, 3+2+1, 3+1+1+1
2+2+2, 2+2+1+1, 2+1+1+1+1
1+1+1+1+1+1+1
【要求】
输入数据:需要划分的整数
输出数据:所有划分结果
11.请把算式中缀表达式转化为后缀表达式,并根据后缀表达式得出计算结果(12分)
【要求】
输入数据:中缀表达式(将运算符写在两个操作数中间的表达式成为中缀表达式)输出数据:后缀表达式(将运算符写在两个操作数后面的表达式成为中缀表达式)结果
注意!运算符的优先顺序。
【样例输入】1+2*(3-4)+5
【样列输出】1234-*+5+
4
12.编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。
(12分)
例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。
【要求】
输入数据:无
输出数据:所有的可能性。
13. 农夫老王种植了一片树木,他想为树林建起一座护栏,为使成本最低,他决定为最外围的树木作为端点建立护栏,如图所示。
请帮设计算法帮助老王找到这些树木的坐标。
(12分)
【要求】
输入数据:所有树木的坐标
输出数据:最外围树木的集合。
【样例输入】(2,1),(1,3),(3,5),(3,3),(5,3),(4,1)
【样列输出】(2,1),(1,3),(3,5),(5,3),(4,1)
14.求解n元联立方程组(12分)a11X1 + a12X2 + … + a1nXn = b1 a21X1 + a22X2 + … + a2nXn = b2 . . an1X1 + an2X2 + … + annXn = bn 【要求】
输入数据:二元方程组的系数矩阵输出数据:结果矩阵
【样例输入】 2 -1 1 1
4 1 -1 5
1 1 1 0
表示2*x1 - 1*x2 + x3 = 1
4*x1 - 1*x2 - x3 = 5
1*x1 - 1*x2 + x3 = 0 【样列输出】 1 0 0 1
0 1 0 0
0 0 1 -1。