ACM必做50题——模拟

合集下载

acm数学竞赛试题

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试题及答案

计算机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协会内部测试

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编程比赛入门题目集

acm编程比赛入门题目集

最少钱币数:【问题描述】这是一个古老而又经典的问题。

用给定的几种钱币凑成某个钱数,一般而言有多种方式。

例如:给定了6种钱币面值为2、5、10、20、50、100,用来凑15元,可以用5个2元、1个5元,或者3个5元,或者1个5元、1个10元,等等。

显然,最少需要2个钱币才能凑成15元。

你的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。

【要求】【数据输入】输入可以有多个测试用例。

每个测试用例的第一行是待凑的钱数值M(1 <= M <= 2000,整数),接着的一行中,第一个整数K(1 <= K <= 10)表示币种个数,随后是K 个互不相同的钱币面值Ki(1 <= Ki <= 1000)。

输入M=0时结束。

【数据输出】每个测试用例输出一行,即凑成钱数值M最少需要的钱币个数。

如果凑钱失败,输出“Impossible”。

你可以假设,每种待凑钱币的数量是无限多的。

【样例输入】156 2 5 10 20 50 10011 2【样例输出】2Impossible/***************** 2010年5月19日*****************/#include<iostream>#include<string>using namespace std;int m[1000];int M;int p;int check() { //找出最少钱币数,并返回其值int b,c,d=0;int p=0;int i,j;int s[10];cin>>b;for( i=1;i<=b;i++)cin>>s[i];/*冒泡排序排出从大到小的钱币面额顺序*/ for( i=1;i<=b;i++)for(j=1;j<=b-i;j++)if(s[j]>s[j+1]){c=s[j];s[j]=s[j+1];s[j+1]=c;}/*尝试用最大面额的钱币开始凑某个价位,并尽量凑足此价位;如果剩余的价位差额可以用剩余的钱币面额凑到,且钱币用量最少,则凑到的原价位所需的钱币用量最少*/for( i=b;i>0;i--){while(M-s[i]>=0){M-=s[i];d++;}}if(M<=0)return d;elsereturn 0;}int main() {int q;/*用循环来解决多次输入样例*/do {cin>>M; q=M;if(q==0)break;p++;m[p]=check();//用数组存储凑成M的最少钱币数 }while(q>0);for(int j=1;j<=p;j++){if(m[j]==0)cout<<"Impossible"<<endl;elsecout<<m[j]<<endl;}return 0;}Feli 的生日礼物【问题描述】Felicia 的生日是11月1日(和Kitty是同一天生的哦)。

acm常用板子题

acm常用板子题

acm常用板子题
ACM常用模板题包括但不限于:
字符串操作:如字符串匹配、字符串排序、字符串还原等题目,需要熟练掌握字符串的基本操作和常用算法。

数组操作:如数组排序、数组查找、数组分割等题目,需要熟练掌握数组的基本操作和常用算法。

树形结构:如二叉树、AVL树、红黑树等题目,需要熟练掌握树形结构的基本操作和常用算法。

图论算法:如最短路径、最小生成树、拓扑排序等题目,需要熟练掌握图论算法的基本操作和常用算法。

动态规划:如背包问题、最长公共子序列、最长递增子序列等题目,需要熟练掌握动态规划的基本操作和常用算法。

搜索算法:如深度优先搜索、广度优先搜索等题目,需要熟练掌握搜索算法的基本操作和常用算法。

数据结构:如哈希表、并查集、线段树等题目,需要熟练掌握数据结构的基本操作和常用算法。

以上是一些常见的ACM模板题,当然还有很多其他的题目类型。

要提高自己的ACM水平,需要多做题、多思考、多总结,不断拓宽自己的算法和数据结构知识面。

程序员必做的50题

程序员必做的50题

【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?【程序2】题目:企业发放的奖金根据利润提成。

利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1。

5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?【程序4】题目:输入某年某月某日,判断这一天是这一年的第几天?【程序5】题目:输入三个整数x,y,z,请把这三个数由小到大输出。

【程序6】题目:用*号输出字母C的图案。

【程序7】题目:将一个正整数分解质因数。

例如:输入90,打印出90=2*3*3*5。

【程序8】题目:输出9*9口诀。

【程序9】题目:要求输出国际象棋棋盘。

【程序10】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?【程序11】题目:判断101-200之间有多少个素数,并输出所有素数.【程序12】题目:打印出所有的“水仙花数”,所谓“水仙花数"是指一个三位数,其各位数字立方和等于该数本身。

例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。

【程序13】题目:利用条件运算符的嵌套来完成此题:学习成绩〉=90分的同学用A表示,60-89分之间的用B表示,6 0分以下的用C表示.【程序14】题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

【程序15】题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数.【程序16】题目:求s=a+aa+aaa+aaaa+aa。

acm竞赛试题及答案

acm竞赛试题及答案

acm竞赛试题及答案ACM(Association for Computing Machinery)竞赛是一项全球性计算机科学竞赛,旨在锻炼参赛者的问题解决能力和编程技巧。

每年都有数千名来自不同学校的学生参加这一挑战。

本文将提供一些最近的ACM竞赛试题以及相应的答案,帮助读者了解和学习竞赛题目的类型和解题思路。

1. 问题描述给定一个由N个整数组成的数组A,请编写一个程序,找出数组中两个不同元素的差的最小值。

2. 输入格式- 第一行包含一个整数N,表示数组A的长度。

- 第二行包含N个以空格分隔的整数,表示数组A中的元素。

3. 输出格式输出一个整数,表示数组中两个不同元素的差的最小值。

4. 示例输入:51 52 9 12输出:15. 解题思路该问题可以通过对数组进行排序,并比较相邻两个数的差值来求解。

首先,将数组A进行升序排序。

然后,遍历排序后的数组,依次计算相邻两个数的差值,并记录其中的最小值。

最后,返回这个最小差值即可。

6. 代码实现```pythondef min_difference(nums):nums.sort() # 对数组进行升序排序min_diff = float('inf') # 初始化最小差值为正无穷大for i in range(len(nums)-1):diff = abs(nums[i] - nums[i+1]) # 计算相邻两个数的差值min_diff = min(min_diff, diff) # 更新最小差值return min_diff# 输入处理N = int(input())A = list(map(int, input().split()))# 调用函数并输出结果result = min_difference(A)print(result)```7. 答案解析对给定的数组进行排序后,遍历数组计算相邻两个数的差值,并记录其中的最小值。

上述代码中,首先将数组A进行升序排序,然后使用一个变量`min_diff`来记录最小差值。

ACM选拔赛试题

ACM选拔赛试题

ACM选拔赛试题
注意:程序文件命名为:Test+题号
1、已知四位数3025有一个特殊性质:它的前两位数30和后两位数25的和是55,而55的平方刚好等于该数(55*55=3025),编写一个程序求出所有的具有这种性质的四位数。

2、有的三位数很独特,它们每位上的数字互不相同且都不大于7,特别是十位数正好是百位数和个位数之差,编写程序求所有这样的三位数。

3、某电台组织一次智力竞赛,计划奖励30人。

准备了50件奖品,得一等奖者可得3件,二等奖可得2件,三等奖可得1件。

希望把所有奖品都发到获奖者手中,请编程找出所有的设奖方案(即各等奖各有多少人)。

4、修改31743的某一位数字,使之成为823的倍数。

5、在自然数中,各位数字之和的11倍正好等于自身的自然数只有一个,编写程序请找出这个自然数。

6、小明的妈妈是负责分发单位工资的。

为了使分发时有足够的零钞,同时又尽量不使每个人领到的钱太零碎。

每个月她都要计算出各种面值的钞票(100元、50元、20元、10元、5元、2元、1元)各需多少张。

假设每个人的工资都是整数元,你能否为她设计一个程序,从键盘输入10个人的工资,再计算各种面值的钞票各需多少张?
7、4名专家对四款赛车进行评论:
A说:2号赛车是最好的。

B说:4号赛车是最好的。

C说:3号赛车不是最佳赛车。

D说:B说错了。

事实上,只有一款赛车最佳,且只有一名专家说对了,其他3人说错了,请编程输出最佳赛车的车号,以及哪一位专家说对了。

北大 poj acm题目推荐50题

北大 poj acm题目推荐50题

-北大poj acm题目推荐50题POJ == 北京大学ACM在线评测系统/JudgeOnline1. 标记难和稍难的题目大家可以看看,思考一下,不做要求,当然有能力的同学可以直接切掉。

2. 标记为A and B 的题目是比较相似的题目,建议大家两个一起做,可以对比总结,且二者算作一个题目。

3. 列表中大约有70个题目。

大家选做其中的50道,且每类题目有最低数量限制。

4. 这里不少题目在BUPT ACM FTP 上面都有代码,请大家合理利用资源。

5. 50个题目要求每个题目都要写总结,养成良好的习惯。

6. 这50道题的规定是我们的建议,如果大家有自己的想法请与我们Email 联系。

7. 建议使用C++ 的同学在POJ 上用G++ 提交。

8. 形成自己编写代码的风格,至少看上去美观,思路清晰(好的代码可以很清楚反映出解题思路)。

9. 这个列表的目的在于让大家对各个方面的算法有个了解,也许要求有些苛刻,教条,请大家谅解,这些是我们这些年的经验总结,所以也请大家尊重我们的劳动成果。

10. 提交要求:一个总文件夹名为bupt0xx (即你的比赛帐号), 这个文件夹内有各个题目类别的子目录(文件夹),将相应的解题报告放入对应类别的文件夹。

在本学期期末,小学期开始前,将该文件夹的压缩包发至buptacm@。

对于每个题目只要求一个POJxxxx.cpp 或POJxxxx.java (xxxx表示POJ该题题号) 的文件,注意不要加入整个project 。

11. 如果有同学很早做完了要求的题目,请尽快和我们联系,我们将指导下一步的训练。

下面是一个解题报告的范例:例如:POJ1000.cpp//考查点:会不会编程序。

//思路:此题要求输入两个数,输出两个数的和,我用scanf 和printf。

//提交情况:Wrong Answer 1次,忘了写printf()。

Compile Error 2次,选错了语言,由于C++ 和G++ 在iostream.h 的不用引用方法;少一个大括号。

ACM必做50题的解题-模拟

ACM必做50题的解题-模拟
break;
}
return 1;
}
int main(){
int i,j,n;
char c;
scanf("%d",&n);
while(n--){
for(i=1; i<=3; i++)
scanf("%s %s %s",left[i],right[i],result[i]);
for(c='A'; c<='L'; c++){
1)选择合适的算法
对于每一枚硬币x逐个试探:
x比真币轻的猜测是否成立?猜测成立则进行输出。
x比真币重的猜测是否成立?猜测成立则进行输出。
2)选择合适的数据结构
以字符串数组存储称量的结果。每次称量时,天平左右最多有6枚硬币。因此,字
符串的长度需要为7,最后一位存储字符串的结束符’\0’,便于程序代码中使用字符串
{
int t,n;
cin>>t;
while(t--){
cin>>n;
int x,y;
int cross[SIZE];
memset(cross,0,sizeof(cross));
for(int i=0;i<n;++i){
cin>>x>>y;
int start,end;
if(x>y){
swapnum(x,y);
case 'u': if( strchr(left[i], x) == NULL) return 0;
break;
case 'e': if(strchr(right[i], x) != NULL || strchr(left[i], x) != NULL) return 0;

河南acm试题及答案

河南acm试题及答案

河南acm试题及答案河南ACM试题及答案1. 问题描述编写一个程序,计算给定整数序列中,满足条件的子序列数量。

条件为:子序列中任意两个相邻元素的差的绝对值不超过1。

2. 输入格式第一行包含一个整数N,表示序列的长度,1 <= N <= 100000。

第二行包含N个整数,表示序列中的元素,-1000000 <= 数字 <= 1000000。

3. 输出格式输出满足条件的子序列数量。

4. 样例输入```51 2 3 2 1```5. 样例输出```5```6. 问题分析本题需要对给定的整数序列进行遍历,使用动态规划的方法来计算满足条件的子序列数量。

设dp[i]表示以第i个元素结尾的满足条件的子序列数量,那么dp[i]的值可以通过dp[i-1](当前元素与前一个元素相等或相邻)和dp[i-2](当前元素与前两个元素相邻)计算得出。

7. 算法实现```pythondef countSubsequences(nums):dp = [0] * (len(nums) + 1)dp[0] = 1for i in range(1, len(nums) + 1):for j in range(i):if abs(nums[i-1] - nums[j-1]) <= 1:dp[i] += dp[j]return sum(dp)```8. 测试用例对于样例输入,程序应输出5,表示有5个满足条件的子序列。

9. 注意事项- 确保输入数据的格式正确。

- 考虑边界条件,如序列长度为1时的情况。

- 动态规划数组的大小应根据序列长度动态调整。

acm基础试题及答案

acm基础试题及答案

acm基础试题及答案1. 题目:给定一个整数数组,请找出数组中第二大的数。

答案:我们可以使用排序的方法,将数组从小到大排序,然后数组中的倒数第二个数就是第二大的数。

或者使用一次遍历的方法,首先初始化两个变量,一个用来存储最大值,一个用来存储第二大的值。

遍历数组,每次比较当前元素与最大值,如果当前元素大于最大值,则更新第二大的值为最大值,并将当前元素赋给最大值;如果当前元素小于最大值但大于第二大的值,则更新第二大的值。

2. 题目:实现一个函数,计算一个字符串中字符出现的次数。

答案:可以使用哈希表来实现,遍历字符串中的每个字符,将其作为键值对存储在哈希表中,键是字符,值是该字符出现的次数。

遍历结束后,哈希表中存储的就是每个字符出现的次数。

3. 题目:给定一个链表,删除链表的倒数第n个节点,并且返回新的链表头节点。

答案:可以使用双指针的方法,首先初始化两个指针,都指向链表的头节点。

然后移动第一个指针,移动n步,此时第一个指针指向倒数第n个节点的前一个节点。

接着同时移动两个指针,直到第一个指针到达链表的末尾,此时第二个指针指向的节点就是需要删除的节点的前一个节点。

然后更新第二个指针的next指针,使其指向第二个指针的next节点的next节点,最后返回链表的头节点。

4. 题目:编写一个函数,判断一个整数是否是回文数。

回文数是指正序和倒序读都一样的数。

答案:首先将整数转换为字符串,然后使用双指针的方法,一个指针从字符串的开始位置,一个指针从字符串的结束位置,向中间移动。

如果两个指针指向的字符不相等,则该整数不是回文数。

如果遍历结束后没有发现不相等的字符,则该整数是回文数。

5. 题目:给定一个字符串,找出其中不含有重复字符的最长子串的长度。

答案:可以使用滑动窗口的方法,维护一个哈希表记录窗口内字符的出现情况,以及一个变量记录不含有重复字符的最长子串的长度。

遍历字符串,每次移动窗口的右端点,如果当前字符不在窗口内,则更新最长子串的长度,并将字符添加到哈希表中。

ACM程序设计竞赛例题[1]

ACM程序设计竞赛例题[1]

备战ACM资料习题1.0-1背包问题在0 / 1背包问题中,需对容量为c 的背包进行装载。

从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。

对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。

程序如下:#include <stdio.h>void 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比较{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++){if(a[i]==1) //如果选取了该物品{weight = weight + w[i]; //累加重量value = value + v[i]; //累加价值}}if(weight<=c) //若为可行解if(value>max) //且价值大于max max=value; //替换max}void readdata(){for(i=0;i<n;i++)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选拔测试题(学生版)

----------------------------精品word 文档 值得下载 值得拥有---------------------------------------------- 1. 座位调整问题问题题目描述:公司办公区里到处摆放着各种各样的零食。

人力资源部的调研发现,员工如果可以在自己喜欢的美食旁边工作,工作效率会大大提高。

因此,公司决定进行一次员工座位的大调整。

调整的方法如下:1 . 首先将办公区按照各种零食的摆放分成 N 个不同的区域。

(例如:可乐区,饼干区,牛奶区等等)。

2 . 每个员工对不同的零食区域有不同的喜好程度(喜好程度度的范围为 1 — 100 的整数, 喜好程度越大表示该员工越希望被调整到相应的零食区域)。

3 . 由于每个零食区域可以容纳的员工数量有限,人力资源部希望找到一个最优的调整方案令到总的喜好程度最大。

数据输入:第一行包含两个整数 N , M ,( 1<=N , M<=300 )。

分别表示 N 个区域和 M 个员工。

第二行是 N 个整数构成的数列 a ,其中 a[i] 表示第 i 个区域可以容纳的员工数, (1<=a[i]<=M , a[1]+a[2]+..+a[N]=M) 。

紧接着是一个 M*N 的矩阵 P , P ( i , j )表示第 i 个员工对第 j 个区域的喜好度。

答案输出:对于每个测试数据,输出可以达到的最大的喜好程度。

测试数据:2. 投资问题问题描述:假设有m 元钱,n 项投资,函数()i f x 表示将x 元投入第i 个项目所产生的效益;问如何分配这m 元钱,使得投资的总效益达到最大?(C/C++程序实现)测试数据:5万元钱,4个项目,效益函数如下表所示测试要求:1. 时间2个小时,用C或C++编写程序;2. 可以携带C语言或C++方面的书;----------------------------精品word文档值得下载值得拥有----------------------------------------------。

acm大学生程序试题及答案

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模拟试题及答案

acm模拟试题及答案

acm模拟试题及答案ACM模拟试题及答案1. 问题描述:给定一个整数数组,请找出数组中第二大的数。

2. 输入格式:第一行包含一个整数N,表示数组的元素个数。

第二行包含N个整数,表示数组的元素。

3. 输出格式:输出数组中第二大的数。

4. 样例输入:53 14 1 55. 样例输出:46. 问题分析:要解决这个问题,我们首先需要对数组进行排序,然后找到第二大的数。

但是,为了提高效率,我们可以使用一次遍历的方法来找到最大的两个数。

7. 算法步骤:- 初始化两个变量,分别用来存储最大值和第二大的值。

- 遍历数组中的每个元素:- 如果当前元素大于最大值,则更新第二大的值等于当前最大值,然后更新最大值为当前元素。

- 如果当前元素小于最大值但大于第二大的值,则更新第二大的值为当前元素。

- 遍历结束后,第二大的值变量即为所求。

8. 代码实现:```pythonn = int(input())nums = list(map(int, input().split()))max_val = float('-inf')second_max_val = float('-inf')for num in nums:if num > max_val:second_max_val = max_valmax_val = numelif num > second_max_val and num != max_val:second_max_val = numprint(second_max_val)```9. 答案分析:- 在样例输入中,数组为[3, 1, 4, 1, 5],最大值为5,第二大的值为4。

- 算法正确地找到了第二大的数,并且避免了使用额外的空间。

10. 注意事项:- 确保数组中至少有两个不同的元素,否则无法找到第二大的数。

- 考虑数组中存在相同元素的情况,算法需要正确处理。

11. 扩展问题:- 如果数组中有多个相同的第二大的数,如何找到它们? - 如果需要找到数组中的第三大的数,算法应该如何修改?12. 附加说明:- 本题考查了数组的处理和排序算法的应用。

ACM练习题

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软件大赛之编程大赛比赛注意事项:●比赛时间为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进制数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、POJ 1029 False coinSlyar:又是假币判断问题,跟POJ1013类似,不过这个题用1013那个算法W A了...后来换了种枚举的算法才过...思路就是假币应该在每个不等式中都出现,最后只要看哪个硬币出现的次数和不等式出现的次数相同,如果这个硬币唯一,那它就是确认的假币。

#include <iostream>#include <string>using namespace std;const int MAX = 1001;int main(){int n, k, p, total = 0;char sign;/* 记录原始数据*/int t[MAX] = {0};/* 标记硬币真假*/int r[MAX] = {0};/* 记录硬币重量*/int w[MAX] = {0};cin >> n >> k;while (k--){/* 读入原始数据*/cin >> p;for (int i = 0; i < 2 * p; i++){cin >> t[i];}cin >> sign;/* 标记肯定为真的硬币*/if (sign == '='){for (int i = 0; i < 2 * p; i++){r[t[i]] = 1;}}/* 左轻右重*/else if (sign == '<'){total++;for (int i = 0; i < p; i++){w[t[i]]--;}for (int i = p; i < 2 * p; i++){w[t[i]]++;}}/* 左重右轻*/else if (sign == '>'){total++;for (int i = 0; i < p; i++){w[t[i]]++;}for (int i = p; i < 2 * p; i++){w[t[i]]--;}}}/* 假币在不等式中每次都应该出现*/ int count = 0, pos = 0;for (int i = 1; i <= n; i++){if (r[i]){continue;}/* 找出每次都出现的"假币" */if (w[i] == total || w[i] == - total){count++;pos = i;}}2、poj 1013 Counterfeit Dollar关于称硬币的问题:此题中赛利已经设计了正确的称量方案,保证从三组称量数据中能得到唯一的答案。

答案可以用两个变量表示:x 假币的标号、w 假币是比真币轻还是比真币重。

x 共有12 种猜测;w 有2 种猜测。

根据赛利设计的称量方案,(x,w )的24 种猜测中,只有唯一的猜测与三组称量数据都不矛盾。

因此,如果猜测(x,w )满足下列条件,这个猜测就是要找的答案:在称量结果为"even'' 的天平两边,没有出现x ;如果w 表示假币比真币轻,则在称量结果为"up'' 的天平右边一定出现x、在称量结果为"down'' 的天平左边一定出现x如果w 表示假币比真币重,则在称量结果为"up'' 的天平左边一定出现x、在称量结果为"down'' 的天平右边一定出现x具体实现时,要注意两点:1) 选择合适的算法对于每一枚硬币x 逐个试探:x 比真币轻的猜测是否成立?猜测成立则进行输出。

x 比真币重的猜测是否成立?猜测成立则进行输出。

2) 选择合适的数据结构以字符串数组存储称量的结果。

每次称量时,天平左右最多有6 枚硬币。

因此,字符串的长度需要为7,最后一位存储字符串的结束符’\0’,便于程序代码中使用字符串操作函数。

char left[3][7], right[3][7], result[3][7];#include <stdio.h>#include <string.h>char left[3][7], right[3][7], result[3][5];int islight( char x ) {int i;for ( i = 1; i <= 3; i++ )switch( result[i][0] ) {case 'u': if( strchr(right[i], x) == NULL ) return 0;break;case 'e': if(strchr(right[i], x) != NULL || strchr(left[i], x) != NULL) return 0;break;case 'd': if(strchr(left[i], x) == NULL) return 0;break;}return 1;}int isheavy( char x ){int i;for ( i = 1; i <=3; i++ )switch( result[i][0] ) {case 'u': if( strchr(left[i], x) == NULL) return 0;break;case 'e': if(strchr(right[i], x) != NULL || strchr(left[i], x) != NULL) return 0;break;case 'd': if(strchr(right[i], x) == NULL) return 0;break;}return 1;}int main(){int i,j,n;char c;scanf("%d",&n);while(n--){for(i=1; i<=3; i++)scanf("%s %s %s",left[i],right[i],result[i]);for(c='A'; c<='L'; c++){if(islight(c)){printf("%c is the counterfeit coin and it is light.\n",c);break;}if(isheavy(c)){printf("%c is the counterfeit coin and it is heavy.\n",c);break;}}}return 0;}/* 假币唯一则输出*/if (count != 1){cout << 0 << endl;}else{cout << pos << endl;}//system("pause");return 0;}3、poj 1083 Moving Tables就是把这400个房间分成200分,1-2,3-4,。

每次移动时,都要把经过的“份”算上,这样最后找份中最大的那个数即可#include <iostream>#include <climits>#include <cstring>#define SIZE 220using namespace std;void swapnum(int &a,int &b);int getindex(int k);int main (){int t,n;cin>>t;while(t--){cin>>n;int x,y;int cross[SIZE];memset(cross,0,sizeof(cross));for(int i=0;i<n;++i){cin>>x>>y;int start,end;if(x>y){swapnum(x,y);}start=getindex(x);end=getindex(y);for(int i=start;i<=end;++i){cross[i]++;}}int maxnum=INT_MIN;for(int i=0;i<SIZE;++i){maxnum=maxnum>cross[i]?maxnum:cross[i];}cout<<maxnum*10<<endl;}return 0;}void swapnum(int &a,int &b){int temp=a;a=b;b=temp;}int getindex(int k){if(k%2==0){return k/2;}else if(k%2==1){return k/2+1;}}4、poj 2028 When Can We Meet?题意:ICPC委员会要安排一个会议,但是成员们都太忙了,所以很难安排,所以要我们编程找个最合适的日子让更多的人来参加这个会议。

一共有N个人,至少要Q个人参加,第i个人有mi天是有空的,分别是date1,date2…..datem,表示明天开始的第datei天,比如date1为1表示明天有空,date2为2表示后天有空,……要输出最好的那天,要求是参加的人尽可能多,如果用相同人数的要尽量靠前。

思路:从第1到max开始枚举,看多少人在第i天有空,如果用>=q的人有空的话,把人数跟i记录下来,放在结构体数组里,最后按人数从大到小排序,如果最大的那个的人数<q 的话输出0,否则就是最大的那个,还要日子靠前的那个。

Max是这么多人的有空的日子里最晚的那天,#include <stdio.h>#include <string.h>#include <stdlib.h>#define N 55#define M 105typedef struct{int index;int count;}item;item items[M];int cmp(const void *p, const void *q){return (*(int *)p) - (*(int *)q);}int cmp2(const void *p, const void *q){item *a = (item *)p;item *b = (item *)q;if(a->count > b->count)return -1;else if(a->count < b->count)return 1;else{return a->index > b->index ? 1 : -1;}}int main(){int i, j, k;int size, quorum, dateNum, result, count, max;int dates[N][M];int *find;while(scanf("%d%d", &size, &quorum) && size && quorum){memset(dates, 0, sizeof(dates));memset(items, 0, sizeof(items));max = 0;for(i=0; i<size; i++){scanf("%d", &dates[i][0]);for(j=1; j<=dates[i][0]; j++){scanf("%d", &dates[i][j]);if(max < dates[i][j])max = dates[i][j];}}for(i=1, k=0; i<=max; i++){for(j=0, count=0; j<size; j++){find = (int *)bsearch(&i, dates[j]+1, dates[j][0], sizeof(dates[j][1]), cmp);if(find != NULL){count++;}}if(count >= quorum){items[k].count = count;items[k].index = i;k++;}if(count == size)break;}qsort(items, k, sizeof(items[0]), cmp2);if(items[0].count >= quorum)printf("%d\n", items[0].index);else printf("0\n");}return 0;}5 、poj 2234 Matches Game 异或的问题不是很理解,没办法强记策略尼姆博奕(Nimm Game):有n堆各若干个物品,两个人轮流从某一堆取任意多(或者最多m个,只需把每堆%m)的物品,规定每次至少取一个,多者不限,最后取光者得胜。

相关文档
最新文档