ACM题目整理
大学ACM考试题目及作业答案整理

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;longlong f(long long m, long long n){if(n==0) return 1;else return f(m-1,n-1)*m/n;}int main(){longlongm,n;while(scanf("%I64d %I64d",&n,&m) &&n+m){printf("%I64d\n",f(m+n,min(m,n)));}return 0;}1、(并查集)若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
acm数学竞赛试题

acm数学竞赛试题
ACM数学竞赛试题通常涉及各种数学领域,包括但不限于代数、几何、概率统计和组合数学等。
以下是一些经典的ACM数学竞赛试题:
1. 平面上n个点的k距离和最小值问题:给定平面上n个点,对于每个点,计算它到其他所有点的距离,然后求出这些距离中的k个最小值。
问题是:如何有效地计算这k个最小值?
2.最长公共子序列问题:给定两个序列,找出它们的最长公共子序列。
例如,对于序列
A = [1, 2, 3, 4] 和
B = [2, 3, 4, 5],最长公共子序列是[2, 3, 4]。
3. 凸包问题:给定平面上的一组点,找到一个最小的凸多边形,使得这个多边形能够包含这组点中的所有点。
4. 最短路问题:给定一个有向图,其中每条边都有一个非负的权重,找出图中任意两点之间的最短路径。
5. 子集和问题:给定一个正整数数组和一个目标值,判断数组中是否存在和为目标值的两个非空子集。
例如,给定数组[1, 2, 3, 4] 和目标值7,判断是否存在两个子集,它们的和分别为7。
以上只是ACM数学竞赛试题的一部分,实际上还有更多涉及数学各个领域的题目。
要提高解决这类问题的能力,需要不断练习和研究。
ACM考试题

ACM程序设计东北林业大学陈宇Lg_chenyu@第一讲算法原理和ACM入门(Introduction to ACM)我校的ACM在线评测系统**课件下载地址:*/kj/suanfa01.ppt预期赛事(今后每年)*3~4月,举行校内大赛(暨选拔赛)*4月,ACM全国邀请赛*5月,参加黑龙江省大学生程序设计大赛*6月,参加东北4省大学生程序设计大赛*10~11月,参加ACM/ICPC亚洲区比赛(至少参加4~5个赛区的比赛)*另外,每学期至少有三次月赛以及适当的练习赛第一部分算法概述*算法分析(Algorithm Analysis):对算法所需要的两种计算机资源——时间和空间进行估算;时间复杂性(Time Complexity)空间复杂性(Space Complexity)算法分析的目的:设计算法——设计出复杂性尽可能低的算法选择算法——在多种算法中选择其中复杂性最低者算法的描述语言:⑴自然语言优点:容易理解缺点:冗长、二义性使用方法:粗线条描述算法思想注意事项:避免写成自然段(2)流程图优点:流程直观缺点:缺少严密性、灵活性使用方法:描述简单算法注意事项:注意抽象层次⑶程序设计语言优点:能由计算机执行缺点:抽象性差,对语言要求高使用方法:算法需要验证注意事项:将算法写成子函数(4)伪代码——算法语言伪代码(Pseudocode):介于自然语言和程序设计语言之间的方法,它采用某一程序设计语言的基本语法,操作指令可以结合自然语言来设计。
优点:表达能力强,抽象性强,容易理解评价算法*评价算法的三条主要标准是:*(1) 算法实现所耗费的时间;*(2) 算法实现所所耗费的存储空间,其中*主要考虑辅助存储空间;*(3) 算法应易于理解,易于编码,易于调*试等等。
和算法执行时间相关的因素:1)问题中数据存储的数据结构2)算法采用的数学模型3)算法设计的策略4)问题的规模5)实现算法的程序设计语言6)编译算法产生的机器代码的质量7)计算机执行指令的速度算法效率的衡量方法*通常有两种衡量算法效率的方法:*1)事后统计法(有缺点,较少使用)*2)事前分析估算法*算法的时间效率是问题规模的函数。
计算机acm试题及答案

计算机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、内存、硬盘等,而软件则是运行在硬件上的程序和数据。
ACM题目、测试用例及参考答案汇编——一次ACM协会内部测试

ACM题目、测试用例及参考答案汇编——一次ACM协会内部测试第一题:梦境是虚幻吗?时间限制:3000ms 内存限制:65535KB 难度:★★描述《盗梦空间》是一部精彩的影片,在这部电影里,Cobb等人可以进入梦境之中,梦境里的时间会比现实中的时间过得快得多,这里假设现实中的3分钟,在梦里就是1小时。
然而,Cobb他们利用强效镇静剂,可以从第一层梦境进入第二层梦境,甚至进入三层,四层梦境,每层梦境都会产生同样的时间加速效果。
那么现在给你Cobb在各层梦境中经历的时间,你能算出现实世界过了多长时间吗?比如,Cobb先在第一层梦境待了1个小时,又在第二层梦境里待了1天,之后,返回第一层梦境之后立刻返回了现实。
那么在现实世界里,其实过了396秒(6.6分钟)输入第一行输入一个整数T(0<=T<=100),表示测试数据的组数。
每组测试数据的第一行是一个数字M(3<=M<=100)随后的M行每行的开头是一个字符串,该字符串如果是"IN" 则Cobb向更深层的梦境出发了,如果是字符串"OUT"则表示Cobb从深层的梦回到了上一层。
如果是首字符串是"STAY"则表示Cobb在该层梦境中停留了一段时间,本行随后将是一个整数S表示在该层停留了S分钟(1<=S<=10000000)。
数据保证在现实世界中,时间过了整数秒。
输出对于每组测试数据,输出现实世界过的时间(以秒为单位)。
样例输入16INSTAY 60INSTAY 1440OUTOUT样例输出396测试输入106INSTAY 60INSTAY 1440OUTOUT6INININOUTOUTOUT7INININSTAY 0 OUTOUTOUT2INSTAY 203INSTAY 0 OUT3INSTAY 10 OUT4INSTAY 10 STAY 10 OUT5INSTAY 20 STAY 20 OUT STAY 120 10INSTAY 20 STAY 20 INSTAY 1440STAY 1440OUTSTAY 120OUTSTAY 11STAY 50测试输出39660306073209723000参考代码:#include<stdio.h>int main(){int n;char a[5];scanf("%d",&n);while(n--){int m,i,b=1,c,time=0;scanf("%d",&m);for(i=0;i<m;i++){scanf("%s",&a);if(a[0]=='I') b*=20;else if(a[0]=='S') {scanf("%d",&c);time+=c*60/b;} else if(a[0]=='O') b/=20;}printf("%d\n",time);}return 0;}第二题:独木舟过河时间限制:3000ms 内存限制:65535KB 难度:★★描述进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别。
ACM中的数学问题March总结

欧几里德算法
• 欧几里德算法 (The Euclidean Algorithm) • 又称辗转相除法 或者 短除法 • 原理: gcd(a,b) = gcd(b,a mod b) • 证明: • 利用整除性质5(a=kb±c => a,b的公因数与b,c的公因数完全相同) • 辗转相除直到两数整除,其中的除数就是要求的最大公约数。
第16页/共96页
请写出12,10共有的倍 数
第17页/共96页
请写出12,10共有的倍 数
60,
第18页/共96页
请写出12,10共有的倍 数
60, 120,
第19页/共96页
请写出12,10共有的倍 数
60, 120, 180,
第20页/共96页
请写出12,10共有的倍 数
60, 120, 180, 240…
第7页/共96页
整除的基本性质
• 性质1: • a|b,b|c => a|c
• 性质2 : • a|b => a|bc
• 性质3 : • a|b,a|c => a|kb±lc
• 性质4 : • a|b,b|a => a=±b
第8页/共96页
整除的基本性质
• 性质5 : • a=kb±c => a,b的公因数与b,c的公因数完全相同 • 证明: • 假设d是b,c的公因数,即d|b, d|c。 • 利用整除性质3,d整除b,c的线性组合,故d|a。 • 所以d是a,b的公因数 • 反之,如果d是a,b的公因数,也能证出d是b,c的公因数
第34页/共96页
扩展欧几里德算法
• 扩展欧几里德算法(递归实现):
第35页/共96页
扩展欧几里德算法
ACM题目分类

(1)串 (poj1035,poj3080,poj1936)
(2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299)
(3)简单并查集的应用.
(4)哈希表和二分查找等高效查找法(数的Hash,串的Hash)
(3)点集最小圆覆盖.
(4)对踵点(poj2079)
八.综合题.
(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263)
同时由于个人练习的时候可能有些偏向性,可能上面的总结不是很全,还请大家提出和指正,而且由于ACM的题目中专门针对某个算法的题目可能比较少出现,所以上面的分类中的题有可能有多种解法或者是一些算法的综合,这都不会影响大家做题,希望练习的同学能够认真,扎实地训练,做到真正的理解算法,掌握算法. 同时在论坛上还有许多前辈的分类,总结,大家也可以按自己的情况采用.注意FTP上有很多的资料,希望大家好好地利用.
目的). (poj2823)
(4)左偏树(可合并堆).
(5)后缀树(非常有用的数据结构,也是赛区考题的热点).
(poj3415,poj3294)
四.搜索
(1)较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
(5)杂题.
(poj1870,poj3296,poj3286,poj1095)
七.计算几何学.
(1)坐标离散化.
(2)扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用).
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
acm大学生程序设计试题

acm大学生程序设计试题题目一:最大公约数(GCD)题目描述:给定两个正整数,求它们的最大公约数(GCD)。
输入两个正整数a和b(1 <= a, b <= 10^9),求它们的最大公约数。
输入格式:两个正整数,以空格分隔。
输出格式:输出一个整数,表示输入两个正整数的最大公约数。
示例:输入:14 21输出:7思路和分析:最大公约数(GCD)可以使用欧几里得算法来求解,即辗转相除法。
具体的步骤如下:1. 用较大的数除以较小的数,将得到的余数作为新的较大数。
2. 再用新的较大数除以较小数,将得到的余数作为新的较大数。
3. 如此重复,直到两个数可以整除,此时较小的数就是最大公约数。
代码实现:```cpp#include <iostream>using namespace std;int gcd(int a, int b) {if (b == 0)return a;return gcd(b, a % b);}int main() {int a, b;cin >> a >> b;int result = gcd(a, b);cout << result << endl;return 0;}```题目二:字符串反转题目描述:给定一个字符串,要求将其反转并输出。
输入一个字符串s(1 <= |s| <= 1000),输出该字符串的反转结果。
输入格式:一个字符串s,只包含大小写字母和数字。
输出格式:一个字符串,表示输入字符串的反转结果。
示例:输入:HelloWorld123输出:321dlroWolleH思路和分析:字符串反转可以使用双指针的方法来实现。
初始时,左指针指向字符串的开头,右指针指向字符串的末尾,然后交换左右指针所指向的字符,并向中间移动,直到左指针不小于右指针。
代码实现:```cpp#include <iostream>using namespace std;string reverseString(string s) {int left = 0, right = s.length() - 1; while (left < right) {swap(s[left], s[right]);left++;right--;}return s;}int main() {string s;cin >> s;string result = reverseString(s); cout << result << endl;return 0;}```题目三:字符串匹配题目描述:给定一个字符串s和一个模式串p,判断s中是否存在与p相匹配的子串。
大一acm竞赛试题及答案

大一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数学竞赛试题及答案# 题目一:数列问题问题描述:给定一个数列 \( a_1, a_2, a_3, \ldots, a_n \),数列中每个元素都是正整数,且满足 \( a_i = a_{i-1} + a_{i-2} \) 对于所有\( i \geq 3 \)。
如果 \( a_1 = 1 \) 且 \( a_2 = 1 \),请找出数列的第 \( n \) 项。
解答:根据题意,这是一个斐波那契数列。
第 \( n \) 项的值可以通过递归关系计算得出。
对于 \( n \) 的值,可以使用以下递归公式:\[ a_n = a_{n-1} + a_{n-2} \]其中,\( a_1 = 1 \) 和 \( a_2 = 1 \)。
因此,数列的前几项为 1, 1, 2, 3, 5, 8, 13, 21, ...。
对于任意的 \( n \),可以通过递归或动态规划方法计算出 \( a_n \)。
# 题目二:组合问题问题描述:从 \( n \) 个不同的元素中选择 \( k \) 个元素的所有可能组合的个数是多少?解答:这个问题可以通过组合数学中的二项式系数来解决。
从 \( n \) 个不同元素中选择 \( k \) 个元素的组合数 \( C(n, k) \) 可以用以下公式计算:\[ C(n, k) = \frac{n!}{k!(n-k)!} \]其中,\( n! \) 表示 \( n \) 的阶乘。
# 题目三:几何问题问题描述:在一个直角坐标系中,给定三个点 \( A(x_1, y_1) \),\( B(x_2, y_2) \) 和 \( C(x_3, y_3) \)。
如果 \( \overrightarrow{AB} \) 和 \( \overrightarrow{AC} \) 是垂直的,求证 \( A \) 是直角三角形 \( ABC \) 的直角顶点。
解答:如果 \( \overrightarrow{AB} \) 和 \( \overrightarrow{AC} \) 垂直,那么它们的数量积(点积)应该为零。
ACM程序设计竞赛例题

ACM程序设计竞赛例题备战ACM资料习题1. 0-1背包问题在0 / 1背包问题中,需对容量为c 的背包进行装载。
从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。
对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
程序如下:#includevoid readdata();void search(int);void checkmax();void printresult();int c=35, n=10; //c:背包容量;n:物品数int w[10], v[10]; //w[i]、v[i]:第i件物品的重量和价值int a[10], max; //a数组存放当前解各物品选取情况;max:记录最大价值//a[i]=0表示不选第i件物品,a[i]=1表示选第i件物品int main() {readdata(); //读入数据search(0); //递归搜索printresult();}void search(int m){if(m>=n)checkmax(); //检查当前解是否是可行解,若是则把它的价值与max 比较else{a[m]=0; //不选第m件物品search(m+1); //递归搜索下一件物品a[m]=1; //不选第m件物品search(m+1); //递归搜索下一件物品}}void checkmax(){int i, weight=0, value=0;for(i=0;i<n;i++)< p="">{if(a[i]==1) //如果选取了该物品{weight = weight + w[i]; //累加重量value = value + v[i]; //累加价值}}if(weight<=c) //若为可行解if(value>max) //且价值大于maxmax=value; //替换max}void readdata(){int i;for(i=0;i<n;i++)< p="">scanf("%d%d",&w[i],&v[i]); //读入第i件物品重量和价值}void printresult(){printf("%d",max);}2.装载问题有两艘船,载重量分别是c1、c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。
acm基础试题及答案

acm基础试题及答案1. 题目:给定一个整数数组,请找出数组中第二大的数。
答案:我们可以使用排序的方法,将数组从小到大排序,然后数组中的倒数第二个数就是第二大的数。
或者使用一次遍历的方法,首先初始化两个变量,一个用来存储最大值,一个用来存储第二大的值。
遍历数组,每次比较当前元素与最大值,如果当前元素大于最大值,则更新第二大的值为最大值,并将当前元素赋给最大值;如果当前元素小于最大值但大于第二大的值,则更新第二大的值。
2. 题目:实现一个函数,计算一个字符串中字符出现的次数。
答案:可以使用哈希表来实现,遍历字符串中的每个字符,将其作为键值对存储在哈希表中,键是字符,值是该字符出现的次数。
遍历结束后,哈希表中存储的就是每个字符出现的次数。
3. 题目:给定一个链表,删除链表的倒数第n个节点,并且返回新的链表头节点。
答案:可以使用双指针的方法,首先初始化两个指针,都指向链表的头节点。
然后移动第一个指针,移动n步,此时第一个指针指向倒数第n个节点的前一个节点。
接着同时移动两个指针,直到第一个指针到达链表的末尾,此时第二个指针指向的节点就是需要删除的节点的前一个节点。
然后更新第二个指针的next指针,使其指向第二个指针的next节点的next节点,最后返回链表的头节点。
4. 题目:编写一个函数,判断一个整数是否是回文数。
回文数是指正序和倒序读都一样的数。
答案:首先将整数转换为字符串,然后使用双指针的方法,一个指针从字符串的开始位置,一个指针从字符串的结束位置,向中间移动。
如果两个指针指向的字符不相等,则该整数不是回文数。
如果遍历结束后没有发现不相等的字符,则该整数是回文数。
5. 题目:给定一个字符串,找出其中不含有重复字符的最长子串的长度。
答案:可以使用滑动窗口的方法,维护一个哈希表记录窗口内字符的出现情况,以及一个变量记录不含有重复字符的最长子串的长度。
遍历字符串,每次移动窗口的右端点,如果当前字符不在窗口内,则更新最长子串的长度,并将字符添加到哈希表中。
2022南开大学acm竞赛题目及答案

2022南开大学acm竞赛题目及答案第一部分理论题(总分100分,考试时间:60分钟)一、选择题(单选,共30题,每个2分)1、下面关于变量及其作用范围的陈述哪个是不对的?()A.实例变量是类的成员变量。
B.实例变量用关键字static声明。
//Static 声明的是类变量C.在方法中定义的局部变量在该方法被执行时创建。
D.局部变量在使用前必须被初始化。
2、下面哪条语句把方法声明为抽象的公共方法?()A.public abstract method();B.public abstract void method();C.public abstract void method(){}D.public void method() extends abstract;3、哪个是将一个十六进制值赋值给一个long型变量?()A.long number = 345L;B.long number = 0345;C.long number = 0345L;D.long number = 0x345L;4、下面的哪个赋值语句是不对的?()A.float f = 11.1;B.double d = 5.3E12;C.double d = 3.14159;D.double d = 3.14D;5、main方法是Java Application程序执行的入口点,关于main 方法的方法头以下哪项是合法的()。
A、public static void main()B、public static void main(String[ ] args)C、public static int main(String[ ] args)D、public void main(String arg[ ])6、在Java中,一个类可同时定义许多同名的方法,这些方法的形式参数个数、类型或顺序各不相同,传回的值也可以不相同。
这种面向对象程序的特性称为()。
ACM程序设计竞赛例题[1]
![ACM程序设计竞赛例题[1]](https://img.taocdn.com/s3/m/8e8360ed84868762cbaed565.png)
A C M程序设计竞赛例题[1]-CAL-FENGHAI.-(YICAI)-Company One1备战ACM资料习题1.0-1背包问题在0 / 1背包问题中,需对容量为c 的背包进行装载。
从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。
对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
程序如下:#include <>void readdata();void search(int);void checkmax();void printresult();int c=35, n=10; ");printf("\n");}printf("\n");}6.素数环问题把从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。
分析:用回溯算法,考察所有可能的排列。
程序如下:#include <>#include <>void search(int);void init(); 表示空格;’X’表示墙。
程序如下:#include <>#include <>void search(int,int);int canplace(int,int);void readdata(); Floodfill给一个20×20的迷宫和一个起点坐标,用广度优先搜索填充所有的可到达的格子。
提示:参考第2题。
2. 电子老鼠闯迷宫如下图12×12方格图,找出一条自入口(2,9)到出口(11,8)的最短路本题给出完整的程序和一组测试数据。
状态:老鼠所在的行、列。
程序如下:#include<>void readdata();a[i][j]=0; ....注:测试数据可在运行时粘贴上去(点击窗口最左上角按钮,在菜单中选则“编辑”/“粘贴”即可)。
acm大学生程序试题及答案

acm大学生程序试题及答案1. 题目:字符串反转描述:给定一个字符串,编写一个函数来将字符串中的字符按相反的顺序重新排列。
输入:一个字符串输出:反转后的字符串答案:```pythondef reverse_string(s):return s[::-1]```2. 题目:寻找最大数描述:给定一个整数数组,找出数组中的最大数。
输入:一个整数数组输出:数组中的最大数答案:```pythondef find_max(nums):return max(nums)```3. 题目:两数之和描述:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数的索引(从1开始计数)。
输入:一个整数数组和一个目标值输出:两个数的索引,如果没有则返回空数组答案:```pythondef two_sum(nums, target):num_to_index = {}for i, num in enumerate(nums):complement = target - numif complement in num_to_index:return [num_to_index[complement] + 1, i + 1] num_to_index[num] = ireturn []```4. 题目:无重复字符的最长子串描述:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
输入:一个字符串输出:最长子串的长度答案:```pythondef length_of_longest_substring(s):char_map = {}start = max_length = 0for end in range(len(s)):if s[end] in char_map:start = max(start, char_map[s[end]] + 1)char_map[s[end]] = endmax_length = max(max_length, end - start + 1)return max_length```5. 题目:整数转罗马数字描述:将一个整数转换为罗马数字。
ACM题库完整版

if(str[i]>='a'&&str[i]<='z') { str[i]=str[i]-32; } i++;
} puts(str); return 0; }
日历问题
1.题目描述 在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年 是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000 和 2400是闰年。 给定从公元2000年1月1日开始逝去的天数,你的任务是给出这一天是哪年哪月哪日星期几。 2.输入 输入包含若干行,每行包含一个正整数,表示从2000年1月1日开始逝去的天数。输入最后一行是?1, 不必处理。可以假设结果的年份不会超过9999。 3.输出 对每个测试样例,输出一行,该行包含对应的日期和星期几。格式为“YYYY-MM-DD DayOfWeek”, 其中 “DayOfWeek” 必须是下面中的一个: "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" 或 "Saturday“。 4.样例输入 1730 1740 1750 1751 -1 5.样例输出 2004-09-26 Sunday 2004-10-06 Wednesday 2004-10-16 Saturday 2004-10-17 Sunday 6.提示 2000.1.1. 是星期六
ACM练习题

ACM练习题(1)描述浙江工商大学校园里绿树成荫,环境非常舒适,因此也引来一批动物朋友来此居住。
童心未泯的redraiment就经常带些碎面包什么的去广场喂鸽子和兔子,并和它们玩耍。
一点也不像大学生,还是一副老不正经的样子,呵呵。
随着鸽子和兔子数目的增多,redraiment带的那点食物已经不够它们瓜分了。
为了能让自己的好朋友吃的饱饱的,redraiment决定统计一下有多少只鸽子和有多少只兔子,以便带来足够的食物。
一、二、三、四、五...他开始数了。
现在,他已经知道有这些鸽子和兔子一共有n个头和m只脚。
请你帮他写个程序计算一下一共有多少只鸽子和兔子。
输入输入包括多组数据。
每行包括2个数据:n、m(代表上面题目中提到的意思1≤n, m≤230)。
n、m都是整数。
输入以0 0作为结束。
输出每组数据的输出都只有一行,分别是鸽子的数量和兔子数量。
如果输入的测试数据不能求得结果,那肯定是redraiment这个马大哈数错了,就输出"Error"提示他。
样例输入35 941 30 0样例输出23 12Error(2)念数字时间限制(普通/Java):1000MS/10000MS 运行内存限制:65536KByte总提交: 727 测试通过: 316描述编一个“念数字”的程序,它能让计算机完成以下工作:当你输入一个0至99 之间的数后,计算机就会用汉语拼音印出这个数。
如果输入的数不在0到99 之间,就印出“CUO LE”。
注:为了使不熟悉汉语拼音的同学也能做这个题,把“零,一,二,三,……,九,十”的拼音法写在下面。
零LING 一YI 二ER 三SAN 四SI 五WU六LIU 七QI 八BA 九JIU 十SHI输入输入数据有多组,每组数据占一行,内容为一个数字,数据以EOF作为结束。
输出输出对应的汉语拼音,字母全部为大写。
每组数据占一行样例输入3511100样例输出SAN SHI WULINGSHI YICUO LE(3)University时间限制(普通/Java):1000MS/10000MS 运行内存限制:65536KByte总提交: 698 测试通过: 304描述在大学里,很多单词都是一词多义,偶尔在文章里还要用引申义。
acm试题及答案

acm试题及答案ACM试题及答案试题 1: 给定一个整数数组,请找出数组中第二大的数。
答案:1. 对数组进行排序。
2. 数组排序后,倒数第二个元素即为第二大的数。
试题 2: 编写一个函数,计算给定字符串中字符出现的次数。
答案:```pythondef count_characters(s):count_dict = {}for char in s:if char in count_dict:count_dict[char] += 1else:count_dict[char] = 1return count_dict```试题 3: 判断一个数是否为素数。
答案:1. 如果数小于2,则不是素数。
2. 从2开始到该数的平方根,检查是否有因数。
3. 如果没有因数,则该数是素数。
试题 4: 实现一个算法,将一个整数数组按照奇数在前,偶数在后的顺序重新排列。
答案:```pythondef rearrange_array(arr):odd = []even = []for num in arr:if num % 2 == 0:even.append(num)else:odd.append(num)return odd + even```试题 5: 给定一个链表,删除链表的倒数第n个节点。
答案:1. 遍历链表,找到链表的长度。
2. 再次遍历链表,找到倒数第n个节点的前一个节点。
3. 将前一个节点的next指针指向当前节点的下一个节点。
4. 如果当前节点是头节点,则更新头节点。
试题 6: 编写一个函数,实现字符串反转。
答案:```pythondef reverse_string(s):return s[::-1]```试题 7: 给定一个整数数组,找出数组中没有出现的最小正整数。
答案:1. 遍历数组,使用哈希表记录出现的数字。
2. 从1开始,检查每个数字是否在哈希表中。
3. 第一个不在哈希表中的数字即为答案。
试题 8: 实现一个算法,计算斐波那契数列的第n项。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目来源:福州大学acm网站代码:fpcdq一、入门熟悉ACM竞赛规则以及程序提交注意事项例题:Problem 1000 A+B ProblemTime Limit: 1000 mSec Memory Limit : 32768 KB Problem DescriptionCalculate 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 in one line,and with one line of output for each line in input.Sample Input1 52 3Sample Output65My answer:#include <stdio.h>main(){long a,b;while((scanf("%ld%ld",&a,&b))!=EOF){printf("%ld\n",a+b);}}详情参考/faq.php二、ACM分类主流算法:1.搜索//回溯Problem 1019 猫捉老鼠Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description一只猫和一只老鼠在10*10的迷宫中。
迷宫中的每个方格可以是空的,或者含有障碍。
猫和老鼠可以进入任意一个空的方格中。
当他们相遇时,猫和老鼠在同一个方格中。
但是,无论猫或老鼠都不能进入有障碍的方格。
我们可以用字符组成的二维数组表示迷宫,如下图所示。
老鼠在迷宫中按照一种固定的方式行走:每个时刻,老鼠都向它所面对的方向前进一格,这需要花费1秒时间。
如果前方是一个障碍或者是迷宫的边界,它将花1秒的时间按顺时针方向转90度。
为了抓到老鼠,这只猫决定也按照与老鼠相同的行走方式行进。
猫和老鼠在每个单位时间内是同时行动的。
因此,如果猫和老鼠在行进过程中“擦肩而过”,猫是无法捉到老鼠的。
只有当猫和老鼠同时到达一个相同的格子时,猫才能捉住老鼠。
初始时,猫和老鼠不会在同一个方格中。
并且它们都面向北方。
你的任务是编一个程序,求出猫捉到老鼠的所花时间。
Input输入数据的第一行n,表示输入数据的组数。
每组数据由10行组成,每行10个字符,表示迷宫的地图以及猫和老鼠的初始位置。
输入数据保证只有一只猫和一只老鼠。
每组输入数据之后均有一个空行作为间隔。
Output对于每组给定的输入,输出一行仅含一个数,即猫捉到老鼠所花的时间。
如果猫永远都无法抓到老鼠,则输出0。
Sample Input1*...*...........*......*...*...............*.c....*.....*......*........m......*...*.*.....*.*......Sample Output49My answer:#include <stdio.h>char str[12][12];void doing(int *fs,int *x,int *y){if(*fs==1){if(str[*x-1][*y]=='*') *fs=4;else *x=*x-1;}else if(*fs==2){if(str[*x+1][*y]=='*') *fs=3;else *x=*x+1;}else if(*fs==3){if(str[*x][*y-1]=='*') *fs=1;else *y=*y-1;}else{if(str[*x][*y+1]=='*') *fs=2;else *y=*y+1;}}main(){int i,j,k,n,p,fs1,fs2,x1,y1,x2,y2;scanf("%d",&n);getchar();for(i=0;i<=11;i++){str[i][0]='*';str[i][11]='*';str[0][i]='*';str[11][i]='*';}for(i=1;i<=n;i++){fs1=1;fs2=1;p=1;for(j=1;j<=10;j++){for(k=1;k<=10;k++){scanf("%c",&str[j][k]);if(str[j][k]=='c'){x1=j;y1=k;str[j][k]='.';}if(str[j][k]=='m'){x2=j;y2=k;str[j][k]='.';}}getchar();}for(j=1;j<10000;j++){doing(&fs1,&x1,&y1);doing(&fs2,&x2,&y2);if(x1==x2&&y1==y2){printf("%d\n",j);p=0;break;}}if(p)printf("0\n");if(i<n)getchar();}}Problem 1063 三维扫描Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description工业和医学上经常要用到一种诊断技术——核磁共振成像(Magnetic Resonance Imagers)。
利用该技术可以对三维物体(例如大脑)进行扫描。
扫描的结果用一个三维的数组来保存,数组的每一个元素表示空间的一个象素。
数组的元素是0-255的整数,表示该象素的灰度。
例如0表示该象素是黑色的,255表示该象素是白色的。
被扫描的物体往往是由若干个部件组合而成的。
例如临床医学要对病变的器官进行检查,而器官是由一些不同的组织构成的。
在实际问题中,同一个部件内部的色彩变化相对连续,而不同的部件的交界处色彩往往有突变。
下面是一个简化的植物细胞的例子。
从细胞的平面图来看,该细胞大致是由四个“部件”构成的,细胞壁、细胞核、液泡和细胞质。
为了方便起见,我们对部件的概念做如下的规定:1.如果一个象素属于某部件,则或者该象素至少与该部件的一个象素相邻,或者该象素单独组成一个部件。
(说明:每一个象素与前后、左右、上下的6个象素相邻)2.同一个部件内部,相邻两个象素的灰度差不超过正整数M。
M决定了程序识别部件的灵敏度。
你的任务是对于给定的物体,判断该物体是由几个部件组成的。
Input输入数据由多组数据组成。
每组数据格式如下:第一行是三个正整数L,W,H(L,W,H≤50),表示物体的长、宽、高。
第二行是一个整数M(0≤M≤255),表示识别部件的灵敏度。
接下来是L×W×H个0-255的非负整数,按照空间坐标从小到大的顺序依次给出每个象素的灰度。
说明:对于空间两点P1(x1,y1,z1)和P2(x2,y2,z2),P1<P2当且仅当(x1<x2)或者(x1=x2且y1<y2)或者(x1=x2且y1=y2且z1<z2) Output对于每组数据,输出仅一行包含一个整数M,即一共识别出几个部件。
Sample Input2 2 21 1 1 12 2 2 2Sample Output2My answer:#include <stdio.h>#include <math.h>int m,l,w,h,c[51][51][51];long sum;doing(int i,int j,int r){int q;q=c[i][j][r];c[i][j][r]=-1;if(i-1>0)if(c[i-1][j][r]!=-1)if(fabs(c[i-1][j][r]-q)<=m)doing(i-1,j,r);if(i+1<=l)if(c[i+1][j][r]!=-1)if(fabs(c[i+1][j][r]-q)<=m)doing(i+1,j,r);if(j-1>0)if(c[i][j-1][r]!=-1)if(fabs(c[i][j-1][r]-q)<=m)doing(i,j-1,r);if(j+1<=w)if(c[i][j+1][r]!=-1)if(fabs(c[i][j+1][r]-q)<=m)doing(i,j+1,r);if(r-1>0)if(c[i][j][r-1]!=-1)if(fabs(c[i][j][r-1]-q)<=m)doing(i,j,r-1);if(r+1<=h)if(c[i][j][r+1]!=-1)if(fabs(c[i][j][r+1]-q)<=m)doing(i,j,r+1);}main(){int i,j,r;while(scanf("%d%d%d",&l,&w,&h)!=EOF){scanf("%d",&m);for(i=1;i<=l;i++)for(j=1;j<=w;j++)for(r=1;r<=h;r++)scanf("%d",&c[i][j][r]);sum=0;for(i=1;i<=l;i++)for(j=1;j<=w;j++)for(r=1;r<=h;r++)if(c[i][j][r]!=-1){sum++;doing(i,j,r);}printf("%d\n",sum);}}Problem 1073 Raiders of the Lost Ark Time Limit: 1000 mSec Memory Limit : 32768 KB Problem DescriptionIn this famous film, renowned archeologist and expert in the occult, Dr. Indiana Jones, is hired by the U.S. Government to find the Ark of the Covenant, which is believed to still hold the ten commandments. Unfortunately, agents of Hitler are also after the Ark. Dr. Jones escapes from various close scrapes in a quest that takes him from Nepal to Cairo. Your task is to help him to find the lost Ark of the Covenant in the maze earlier than the enemy.There are several barriers in the maze, Dr. Jones can bypass these barriers on foot or by jump .He can go on foot in four directions of east, south, west and north to reach a neighboring position. He can also jump cross a cell in the directions of southeast, southwest, northeast and northwest to reach a new position. The following figure shows Dr. Jones's action where O denotes the original position and X denotes the new possible positions after one action.InputThe first line of the input is an integer n (0<=n<=20), denoting the number of test cases. The following lines are the data of n test cases. The first line of each test case consists of two integer x and y (0<x<10, 0<y<10). The next x lines describe the maze matrix, which contains x rows and y columns. In the matrix, 'W' denotes the barrier, 'B' denotes the enterable position, 'S' denotes the starting position, and 'X' denotes the position of the ark. There have and only have one 'S' and one 'X' in a maze matrix.OutputFor each test case, output one line. If there is a solution for the problem, output the number of the least steps to find the Ark. Otherwise output "NO ANSWER".Sample Input33 3SWBBWBXBB5 4BXWBBBWSBBWBBBWBBBBB3 2WXWWWSSample Output22NO ANSWERMy answer:#include <stdio.h>int n,m,p[13][13],x1,x2,y1,y2;char s[13][13];doing(int x,int y,int z){if(z>=p[x][y])return 0;p[x][y]=z;if(x-1>0)if(s[x-1][y]=='B')doing(x-1,y,z+1);if(y-1>0)if(s[x][y-1]=='B')doing(x,y-1,z+1);if(x<n)if(s[x+1][y]=='B')doing(x+1,y,z+1);if(y<m)if(s[x][y+1]=='B')doing(x,y+1,z+1);if(x-2>0&&y-2>0)if(s[x-2][y-2]=='B')doing(x-2,y-2,z+1);if(x-2>0&&y+2<=m)if(s[x-2][y+2]=='B')doing(x-2,y+2,z+1);if(x+2<=n&&y-2>0)if(s[x+2][y-2]=='B')doing(x+2,y-2,z+1);if(x+2<=n&&y+2<=m)if(s[x+2][y+2]=='B')doing(x+2,y+2,z+1);}main(){int i,j,r,k;scanf("%d",&k);for(r=1;r<=k;r++){scanf("%d%d%*c",&n,&m);for(i=1;i<=n;i++){for(j=1;j<=m;j++){p[i][j]=20000;scanf("%c",&s[i][j]);if(s[i][j]=='S'){x1=i;y1=j;s[i][j]='B';}if(s[i][j]=='X'){x2=i;y2=j;s[i][j]='B';}}getchar();}doing(x1,y1,0);if(p[x2][y2]==20000)printf("NO ANSWER\n");else printf("%d\n",p[x2][y2]);}}Problem 1081 等分液体Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description有三种容器R1,R2,R3,其容积分别是L,M,N。